@Peter II:
Volltreffer, vielen Danke! Ich habe dich erst so verstanden, dass bool
innerhalb c++ falsch definiert sein sollte, aber mit deinem neuen Post
war mir klar was du meinst.
Es ist tatsächlich so, dass mein C++-Compiler lediglich die untersten 8
Bits auf null setzt, weil ein bool-Wert für ihn nur aus einem Byte
besteht.
Der C#-InteropService jedoch betrachtet alle 4 Byte, und da diese
ungleich null sind, ist der Wert folglich für ihn "true".
Mögliche Lösungen, die ich bisher entdeckt habe sind zum einen, das
eax-Register vor dem return(false) vollständig nullzusetzen:
1 | __asm mov eax,0
|
2 | return(false);
|
oder alternativ eine Marshalling-Diektive beim DLL-Import angeben:
1 | [DllImport("file.dll", CallingConvention = CallingConvention.StdCall)]
|
2 | [return: MarshalAs(UnmanagedType.I1)]
|
3 | public static extern bool fool();
|
Beides recht unschön, da man es vergessen kann, aber ein Workaround fürs
Erste...
Peter