DLLs und Strings, PeekS und Global
Verfasst: 14.03.2012 20:58
Tachchen,
derzeit stehe ich vor einem kleinen Problem bezüglich DLLs und Strings.
Laut Hilfe muss ein String, welcher aus der DLL zurückgegeben wird, global sein,
damit er nach dem Verlassen der DLL-Prozedur noch verfügbar ist. (klar)
Dieser muss dann zusätzlich mit PeekS() gelesen werden, da es nur ein Pointer zurückgegeben wird. (klar)
Scheinbar funktioniert das Übergeben von String an die DLL "alleine" also ohne PeekS in der DLL-Prozedur (hmm).
Nun habe ich aber ein Problem wenn der "Weg" nicht nur PB -> DLL-Prozedur -> PB ist, sondern wie im folgenden Beispiel:
PB -> DLL-Prozedur -> PB-Prozedur -> DLL-Prozedur -> PB
Mit anderen Worten, ich möchte eine DLL-Prozedur aufrufen welche selbst eine übergebene PB-Prozedur ausführen soll.
Evaluate.pb für die Erstellung der Evaluate.dll (Evaluate.lib):
Example.pb zum nutzen der Evaluate.dll
Theoretisch sollte ich nun "++ -- Hallo Welt! -- ++" bekomme, jedoch bekomme ich nur:
"++ ++", also das Resultat aus der DLL aber ohne den Inhalt von der PB-Prozedur.
Ansatz wäre nun:
Ich muss auch ein PeekS() in der DLL machen, damit ich Strings von PB bekomme, aber wieso brauch ich das dann nicht bei Parametern im allgemeinen ? (unklar)
Neue Evaluate.pb wäre also:
Nur muss ich dann auch in PB die Rückgabe-Strings immer global machen, damit die DLL darauf zugreifen kann?
Denn die Example.pb funktioniert auch ohne weitere Änderungen. (unklar)
Vielleicht kann mir jemand etwas mehr Licht in die Sache bringen, wann ich ein String-Result global machen muss und mit PeekS lesen muss.
Immer wenn es von DLL->PB oder PB->DLL geht?
derzeit stehe ich vor einem kleinen Problem bezüglich DLLs und Strings.
Laut Hilfe muss ein String, welcher aus der DLL zurückgegeben wird, global sein,
damit er nach dem Verlassen der DLL-Prozedur noch verfügbar ist. (klar)
Dieser muss dann zusätzlich mit PeekS() gelesen werden, da es nur ein Pointer zurückgegeben wird. (klar)
Scheinbar funktioniert das Übergeben von String an die DLL "alleine" also ohne PeekS in der DLL-Prozedur (hmm).
Nun habe ich aber ein Problem wenn der "Weg" nicht nur PB -> DLL-Prozedur -> PB ist, sondern wie im folgenden Beispiel:
PB -> DLL-Prozedur -> PB-Prozedur -> DLL-Prozedur -> PB
Mit anderen Worten, ich möchte eine DLL-Prozedur aufrufen welche selbst eine übergebene PB-Prozedur ausführen soll.
Evaluate.pb für die Erstellung der Evaluate.dll (Evaluate.lib):
Code: Alles auswählen
Prototype.s Function(Parameter.s)
Global Result.s
ProcedureDLL.s Evaluate(Function.Function, Parameter.s)
Result = "++ " + Function(Parameter) + " ++"
ProcedureReturn Result
EndProcedureCode: Alles auswählen
Import "Evaluate.lib"
Evaluate(*Function, Parameter.s)
EndImport
Procedure.s Test(Parameter.s)
ProcedureReturn "-- " + Parameter + " --"
EndProcedure
Debug PeekS(Evaluate(@Test(), "Hallo Welt!"))
"++ ++", also das Resultat aus der DLL aber ohne den Inhalt von der PB-Prozedur.
Ansatz wäre nun:
Ich muss auch ein PeekS() in der DLL machen, damit ich Strings von PB bekomme, aber wieso brauch ich das dann nicht bei Parametern im allgemeinen ? (unklar)
Neue Evaluate.pb wäre also:
Code: Alles auswählen
Prototype.i Function(Parameter.s)
Global Result.s
ProcedureDLL.s Evaluate(Function.Function, Parameter.s)
Result = "++ " + PeekS(Function(Parameter)) + " ++"
ProcedureReturn Result
EndProcedure
Denn die Example.pb funktioniert auch ohne weitere Änderungen. (unklar)
Vielleicht kann mir jemand etwas mehr Licht in die Sache bringen, wann ich ein String-Result global machen muss und mit PeekS lesen muss.
Immer wenn es von DLL->PB oder PB->DLL geht?