Laden...

[gelöst] DLL Import Probleme mit Callback-Funktion

Erstellt von weismat vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.583 Views
W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 16 Jahren
[gelöst] DLL Import Probleme mit Callback-Funktion

Ich moechte unmanaged Code aus meinem Programm aufrufen.
Dabei muss ich Parameter setzen und dann eine Callback-Funktion aufrufen.
Die Definition der Callback-Funktion lautet:


DLLIMPORT void SetCallback(int (*CallbackFunction)(int,int,unsigned int,char*,unsigned int,void*,unsigned char));

Diesen Callback habe ich uebersetzt nach:


unsafe delegate int callback(int a, int b, uint c, string s, uint d, void * data, byte e;

Der Code ruft dann auch zweimal brav das Delegate auf, beim 3. Aufruf stuerzt das Programm dann ab.
Im Debugger faellt mir auf, dass nach dem zweiten Aufruf b rot angezeigt wird.
Ausserdem koennte es vielleicht eine Rolle spielen, dass ich eine 64 Bit-Workstation (Opteron) benuzte und die DLL 32-bit ist?
Welche Moeglichkeit gibt es die Signatur der DLL anzuschauen, da vielleicht doch eventuell etwas in dem Header nicht stimmt...

B
387 Beiträge seit 2005
vor 16 Jahren

Hallo,
hast du dein Projekt dann auch auf 32Bit kompiliert (nicht AnyCPU)? Denn bei AnyCPU nutzt der dann den prozessortyp, der tatsächlich drinn ist, also bei dir 64 Bit. Somit vertragen sich warscheindlich deine Assembly und die dll nicht ganz.
Das könne dein Problem sein.

Mfg

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 16 Jahren

Wo traegt man das genau ein?
Ich habe mitlerweile den Code deshalb wie folgt geaendert:


unsafe delegate int callback(Int32 mainMsg, Int32 SubMsg, UInt32 SymbolID, String Symbol, UInt32 SymCount, IntPtr data, Char DocID);

Das Ergebnis ist leider dasgleiche. Es liegt wohl nicht an 32 vs 64 Bit...
(Auf die idee bin ich durch folgenden Link gekommen🙂

B
387 Beiträge seit 2005
vor 16 Jahren

Normalerweise verteckt sich das in den Projekteigenschaften bei Erstellen. Da steht normalerweise irgendwo Zielplatform, da kannst du dann zwischen mehereren auswählen.

Falls du es da (so wie ich bei mir zu hause) nicht findest, kannst du das auch über den Konfigurationsmanager bei Platform einstellen. Falls x86 noch net da is, einfach neu anlegen.

edit: Grad hab ich mir den neuen Delegaten von dir noch angeschaut. 64 bit heist nicht das die Zahlen 64 bit groß sind, sondern das die Adressen 64 bit groß sind.

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 16 Jahren

Ich habe den Delegate nach dem erwaehnten MSDN-Artikel angepasst.
Das Fehlerverhalten hat sich nicht veaendert - wann erscheinen denn Werte Rot im Debugger?

4.221 Beiträge seit 2005
vor 16 Jahren

wann erscheinen denn Werte Rot im Debugger?

Immer wenn sich der Wert gegenüber dem letzten Durchlauf verändert hat.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
8.746 Beiträge seit 2005
vor 16 Jahren

Könnte es sein, dass der String nicht null-terminiert ist?

W
weismat Themenstarter:in
872 Beiträge seit 2005
vor 16 Jahren

Das Problem war, dass der Callback _cdecl entsprechen muss.
Nachdem ich vor dem Delegate


[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

hinzugefuegt habe, funktioniert alles.