Seite 1 von 2

callback procedure in Exe

Verfasst: 13.10.2018 17:19
von HPW
Hallo,

Habe die Frage zunächst im franz.Forum gepostet:

https://www.purebasic.fr/english/viewto ... 13&t=71552

Kann eine purebasic.exe ProcedureDLL nutzen?
Kann ich eine purebasic Procedurevon einer Dll aus mit dem @-Adress-pointer und kompatiblen Parametern aufrufen?
Hat schon mal jemand mit einer purebasic dll einen callback in eine purebasic exe gemacht?

Grüsse,
Hans-Peter

Re: callback procedure in Exe

Verfasst: 13.10.2018 17:25
von RSBasic
Ja, letztens: viewtopic.php?p=348978#p348978

Ausschnitt:

Code: Alles auswählen

MultiKBHook = OpenLibrary(0, "MultiKBHook.dll")
  If MultiKBHook
    HookID = SetWindowsHookEx_(#WH_KEYBOARD, GetProcAddress(MultiKBHook, "KeyboardProc"), MultiKBHook, 0)
    If HookID = 0
      Debug "Hook konnte nicht erstellt werden."
    EndIf
  Else
    Debug "Die DLL-Datei konnte nicht gefunden werden."
  EndIf

Re: callback procedure in Exe

Verfasst: 13.10.2018 21:33
von HPW
Hallo,

Erst mal Danke für die Antwort.
Bin mir nur nicht sicher ob das Beispiel mein Problem trifft.

In diesem Link schien mir das vielversprechend:

https://www.purebasic.fr/english/viewto ... 12&t=52807

Das schien mir meine Anforderung zu treffen.

Ich möchte aus meiner Purebaisc-Exe eine DLL laden, diese aufrufen und während der Ausführung in der DLL eine Procedure in der Main-Exe mit Paramtern aufrufen können. (Klasischer CallBack, habe es in Delphi und PdScript schon so gemacht)

Habe das aber bislang nicht ans Laufen bekommen.

Grüsse,

Re: callback procedure in Exe

Verfasst: 13.10.2018 22:06
von HeX0R
Na klar geht das, das mache ich ständig in meinem aktuellen Projekt.
Du reichst die Adresse der (main) Prozedur an die DLL, und die kann die einwandfrei aufrufen.

Das ist übrigens kein französisches Forum, das Du da verlinkt hast, und lass in Zukunft diese Cross-Postings!

Hier der Code:
Dll:

Code: Alles auswählen

Prototype.f PR_Multiply(a.f, b.f)
Global Multiply.PR_Multiply

ProcedureDLL Init(*AddressToMultiplyProcedure)
	Multiply = 	*AddressToMultiplyProcedure
	Multiply(12, 2.5)
EndProcedure
Main:

Code: Alles auswählen

Prototype PR_Init(*address)

Global Init.PR_Init

Procedure mul(a.f, b.f)
	MessageRequester("Main Program now!", "Result: " + StrF(a * b))
EndProcedure



If OpenLibrary(0, "dlltest.dll")
	Init = GetFunction(0, "Init")
	If Init
		Init(@mul())
	EndIf
	
	
	OpenConsole()
	Input()
	
	CloseLibrary(0)
EndIf

Re: callback procedure in Exe

Verfasst: 14.10.2018 00:49
von HPW
Hallo HeXOR,

Danke für das Beispiel. Gut zu wissen das es im reinen Purebasic Duo erst mal geht.
Nun habe ich in meinem Fall die Dll-Seite nicht in der Hand.
Ich nutze als Dll ja den newlisp-interpreter der eine generische Callback-Unterstützung hat.
Der ruft die Funktion auch mittels der Adresse der Procedure auf.
Die Parameter sind aber immer Pchar im Utf8 Format. Das hätte ich ja in Purebasic-Main in der Hand.
Morgen werde ich versuchen anhand deines Beispiels meinen Test zu verändern.

Entschuldigung das ich das Forum als französisches Forum bezeichnet habe.
Habe mich von der Domain purebasic.fr dazu verleiten lassen.
Also besser das internationale Forum?
Aber es sind doch unterschiedliche Communitys oder?
Es mag ja eine Menge User geben die beide Foren lesen.
Aber erreiche ich mit einem Hilfe-Ersuchen in beiden Foren nicht einfach mehr Experten.
So hat zum Beispiel in einem anderen Thread zu newlisp Fred im internationalem Forum geantwortet und mich auf den richtigen Weg gebracht. Ich bin für jede Hilfe dankbar. Ob international oder hier im deutschen Forum. Ist das Falsch?

Grüsse,
Hans-Peter

Re: callback procedure in Exe

Verfasst: 14.10.2018 09:05
von HeX0R
Naja, als "falsch" würde ich es nicht bezeichnen, immerhin hast du von Anfang an darauf hingewiesen, dass die selbe Frage noch anderswo steht.
Aber stell Dir vor, Du bekommst Deine Anfrage in einem der Boards gelöst, siehst das aber erst nen paar Tage später, die im anderen Board wissen davon aber nichts (die deutschsprachigen lesen meist dort auch mit, umgekehrt eher selten) .
Dann gibt's dort auch jede Menge User, die sich Gedanken machen und (unnötigerweise) Zeit für Dich investieren.
Das könnte dann den einen oder anderen verärgern.

Das was Fred dort für Dich geschrieben hat, hättest Du hier auch als Antwort bekommen.

Beide Communities sind ähnlich gut aufgestellt.

Man lernt auch mit der Zeit, wo eine Frage besser platziert ist.

Re: callback procedure in Exe

Verfasst: 14.10.2018 09:54
von HPW
Hallo HeXOR,

Danke für die Argumente. Werde ich so halten. Wenn ich dann sofort beide Treads aktualisiere sollte es ja gehen.

Zurück zum Problem:
Anhand eines Codes ist mir etwas aufgefallen. Du hattest @mul() verwendet.

Code: Alles auswählen

Procedure CallBack1(*CallBackParam)
   theString.s = PeekS(*CallBackParam,-1,#PB_UTF8)
   MessageRequester("CallBackDemo1", "Param; "+ theString)
EndProcedure 

Procedure CallBack2()
   MessageRequester("CallBackDemo2", "NoParam")
EndProcedure 

Code: Alles auswählen

  MessageRequester("Debug", "CallBackAdress: "+ @CallBack2())
  MessageRequester("Debug", "ExeAdress: "+ @hpwNewLisp)
  newlispCallbackStr("foo", @CallBack2() ,"stdcall")
Durch Ersetzen von @CallBack2 zu @CallBack2() wird ein anderer Pointer übegeben.
Damit wird die Procedure jetzt auch gerufen und der Dialog wird angezeigt.
Aber am Ende der Procedure wirft er wieder einen Fehler.
[ERROR] Ungültiger Speicherzugriff. (Schreibfehler an der Adresse 0)
Markiert wird die Zeile EndProcedure.
Ausserdem kommt der Textparameter bei Callback1 nicht an.

Grüsse,
Hans-Peter

Re: callback procedure in Exe

Verfasst: 14.10.2018 10:11
von HeX0R
Wenn Du @Callback2() übergibst, kann Callback1 auch nicht aufgerufen werden.
Und da Deine DLL einen Parameter übergibt, ist der Stack beim ProcedureReturn korrupt.

Re: callback procedure in Exe

Verfasst: 14.10.2018 10:26
von HPW
Mein Fehler beim Posten.
Ich hatte mit beiden Aufrufen getestet. Auch bei Callback1 wird am Ende der Procedure der Fehler geworfen.
Das hatte ich mit "Ausserdem kommt der Textparameter bei Callback1 nicht an." gemeint.

Ich frage mich ob meine bishrige Definition des Parameters bei einem PChar mit Utf8 Inhalt richtig ist.
Und ansonsten verstehe ich Stack und ProcedureReturn im purebasic context (noch) nicht.

Grüsse,

Re: callback procedure in Exe

Verfasst: 14.10.2018 12:23
von mk-soft
Purebasic hält sich an den Standards für Funktionsaufrufe und somit auch die Verarbeitung vom Stack.

Folgende fragen tun sich da auf welches format die DLL für den Callback benötigt:
- Funktion als StandardCall oder CDecl
- Anzahl der Parameter
- UTF-8 String übergabe als Pointer (Standard) oder als Pointer auf den Pointer vom dem String

Code: Alles auswählen

; Anzahl der Parameter prüfen
Procedure CallBack1(*CallBackParam)
  theString.s = PeekS(*CallBackParam,-1,#PB_UTF8)
  MessageRequester("CallBackDemo1", "Param; "+ theString)
EndProcedure

ProcedureC CallBack2(*CallBackParam)
  theString.s = PeekS(*CallBackParam,-1,#PB_UTF8)
  MessageRequester("CallBackDemo1", "Param; "+ theString)
EndProcedure

Procedure CallBack2(*CallBackParam.integer)
  theString.s = PeekS(*CallBackParam\i,-1,#PB_UTF8)
  MessageRequester("CallBackDemo1", "Param; "+ theString)
EndProcedure

ProcedureC CallBack4(*CallBackParam.integer)
  theString.s = PeekS(*CallBackParam\i,-1,#PB_UTF8)
  MessageRequester("CallBackDemo1", "Param; "+ theString)
EndProcedure

*CallbackAddr = @CallBack1()