Seite 1 von 2

[C++] DLL-Callback-Funktion

Verfasst: 22.02.2009 17:48
von X0r
Hi,
ich hab hier folgende DLL in PB geschrieben:

Code: Alles auswählen

ProcedureDLL myfunc(*func)
CallFunctionFast(*func,"a","b")
EndProcedure
Nun wills in C++ einfach nicht funktionieren, die myfunc-Funktion meine Funktion in C++ aufrufen zu lassen. Das Programm stürtzt einfach ab.

Verfasst: 22.02.2009 17:58
von cxAlex
C benutz CDECL Aufrufkonvention, du must schreiben:

Code: Alles auswählen

ProcedureCDLL

Verfasst: 22.02.2009 18:30
von milan1612
Deklarier deine C++ Funktion so

Code: Alles auswählen

extern "C" void myfunc();
und es sollte funktionieren...

Verfasst: 22.02.2009 18:36
von X0r
Ja mach ich ja und die anderen Funktionen der DLL kann ich auch problemlos aufrufen, allerdings stürzt er immer bei dieser Funktion ab.

Verfasst: 22.02.2009 18:40
von Andesdaf
es kann ja auch durchaus der Inhalt der Procedure sein...

Verfasst: 22.02.2009 18:41
von X0r
/:->
Also ne, auf sowas pass ich schon auf, inhaltslos.

Edit:
Es funktioniert einfach nicht. :?
Könnte bitte jemand so lieb sein und es mal testen.

Verfasst: 22.02.2009 19:17
von milan1612
Pack doch bitte mal ein Beispielprojekt zusammen, dann werd ichs mir mal ansehen.

Verfasst: 22.02.2009 19:19
von X0r
:mrgreen:
Ich poste erstmal den Code, vielleicht kommste ja so drauf:
.h-Datei:

Code: Alles auswählen

//...
__declspec(dllimport) long  __stdcall FSU_ReceiveUpdateInformation(void* procadr);
//...
dann in der main.cpp-Datei.

Code: Alles auswählen

//...
FSU_ReceiveUpdateInformation(UpdateInfo);
//...

Verfasst: 22.02.2009 19:27
von milan1612
Und wie benutzt du die DLL? Per Import Lib oder mit der API? Bitte pack
doch mal schnell ein VS Beispielprojekt zusammen, sonst kann ich da gar
nix debuggen und die Compileroptionen bleiben mir auch unbekannt...

Verfasst: 22.02.2009 20:42
von X0r
So, hab jetzt nochmal paar Tests gemacht.
Also, wenn die Funktion von der DLL ohne Parameter aufgerufen wird, funktioniert es wunderbar. Ansonsten gibts nen Absturz.
Und dann hat man den Fehler auch schon. Man muss CallCFunctionFast nehmen.