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...
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
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🙂
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.
Ich habe den Delegate nach dem erwaehnten MSDN-Artikel angepasst.
Das Fehlerverhalten hat sich nicht veaendert - wann erscheinen denn Werte Rot im Debugger?
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...
Könnte es sein, dass der String nicht null-terminiert ist?
Das Problem war, dass der Callback _cdecl entsprechen muss.
Nachdem ich vor dem Delegate
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
hinzugefuegt habe, funktioniert alles.