Seite 1 von 1

DLL - Return of String - Falsches Auslelsen von String's

Verfasst: 13.12.2014 00:17
von FooFenrir
Hallo allesamt,
sorry wenn schon ein ähnlichen Beitrag irgendwo im Forum steht.
Ich habe aus den Foren ein Test Beispiel zusammengebastelt. MeineDll.dll mit Zwei Prozeduren mit den Ziel das ich mit MeineDll.pb diese String’s Abfragen kann.

Das Ergebnis ist das in beiden Abfragen nur das erste Buchstabe durch das PeekS gelesenen wird. Wenn ich aber die TEIL 1 Code von der TEIL2 in zwei verschiedene PB module trenne dann sind die im TEIL2 gelesenen String’s richtig angezeigt worden.
Ich verstehe nicht was ich da falsch mache.
Hier der Code als Beispiel:

Code: Alles auswählen

; MODUL PB

; TEIL 1 - Name der Library Funktionen ablesen
#LIBRARY = 0

If OpenLibrary(#LIBRARY,"MeineDll.dll") ; Name of DLL to browse. 
  If ExamineLibraryFunctions(#LIBRARY) 
  Debug LibraryID(#LIBRARY)
    While NextLibraryFunction() 
    Debug LibraryFunctionName() 
    Wend 
  EndIf 
  CloseLibrary(#LIBRARY) 
EndIf 


;TEIL 2 - Aus der DLL die String's holen.
If OpenLibrary(1, "MeineDll.dll")
  ExamineLibraryFunctions(1) 
  
  *Ergebnis = CallFunction(1, "start001")
  Debug PeekS(*Ergebnis)

  *Ergebnis = CallFunction(1, "start002")
  Debug PeekS(*Ergebnis)
  
  CloseLibrary(1)
EndIf

Code: Alles auswählen

;DLL
ProcedureDLL AttachProcess(Instanz.i)
  Global MeinString.s = "#Hier lese ich einen Wert"
EndProcedure

ProcedureDLL.s start001()
  ProcedureReturn MeinString
EndProcedure

ProcedureDLL.s start002()
  ProcedureReturn "#Auch gelesen"
EndProcedure
Vielen Dank
Bye

FooFenrir

Re: DLL - Return of String - Falsches Auslelsen von String's

Verfasst: 13.12.2014 00:27
von STARGÅTE
Wie es auch in der Hilfe steht:

Alle zurückgegebenen Strings müssen als Globale Variablen an das ProcedureReturn gegeben werden, da sie sonst in der DLL freigegeben werden und damit nicht vom Main-Programm gelesen werden können.
Somit geht Teil 2 schon mal nicht.

Wenn deine DLL als Unicode kompiliert wurde, liegt der String als Unicode vor.
Wird deine Main als Ascii kompiliert, ließt PeekS() als Ascii und dschneidet somit nach dem ersten Zeichen ab, weil es denkt es kommt eine NUL.

Re: DLL - Return of String - Falsches Auslelsen von String's

Verfasst: 13.12.2014 00:39
von FooFenrir
Hallo STARGÅTE,

mit der Zuweisung von Globalen Variablen habe ich verstanden :oops: nach lange lesen und gegen der Wand prallen. :D :D :D
Ich habe es Getestet ohne UNICODE und es Funktioniert wunderbar, und „glaube habe es auch verstanden zu haben :iamwithstupid: .

Dafür DANKE, DANKE, DANKE.
Bye
FooFenrir