Laden...

ANSI C bool Typ

Erstellt von Lynix vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.136 Views
L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 18 Jahren
ANSI C bool Typ

Hallo zusammen !

Ich hab eine C-dll in der eine Funktion drin deklariert ist, die einen bool als Rückgabewert liefert.

Auf C#-Seite bin ich gerade in eine Falle gerannt. Marshallt man die Funktion nämlich so :


[DllImport("MyFuncs.dll")]
public static extern bool CheckState();

dann liefert die Funktion immer true zurück, egal ob auf der C-Seite der return-Wert true oder false war.

Wie ich jetzt herausgefunden habe, liegt das daran, dass der ANSI C bool Typ eine 1-bit Zahl (0 oder 1) ist, das Default-Marshalling von .NET den bool Typ aber als 32-bit Zahl auffasst.

stattdessen muss man auf C#-Seite so marshallen :


[DllImport("MyFuncs.dll")]
[return : MarshalAs(UnmanagedType.I1)]
public static extern bool CheckState();

Meine Frage lautet jetzt : Wie sieht das ganze aus, wenn ich dieselbe C-Funktion auf Visual Basic 6.0 Seite über ein Declare einbinden will ? Muss ich hier auch etwas ähnliches wie ein Marshalling machen, oder kommt VB 6 "instinktiv" mit Ansi C-Typen klar ?

"It is not wise to be wise" - Sun Tzu

S
1.047 Beiträge seit 2005
vor 18 Jahren

nur mal so am rande, das hier ist ein c# bzw. .net forum... mit etwas glück gibts hier auch ein paar alte vb hasen, ansosnten is deine frage aber sicher besser in einem vb forum aufgehoben...

6.862 Beiträge seit 2003
vor 18 Jahren

In VB 6 ist das True als -1 festgelegt! Das hab ich mal leidlich feststellen müssen als ich nen C++ COM Server aus VB heraus benutzt habe und erstmal gar nichts ging bei den boolschen Ausdrücken.

Schon seltsam wenn da ne Zeile hast wo etwas sowas steht

If response.Positive = True Then ...

Du fragst dich warum der Vergleich nicht funktioniert, obwohl response.Positive true sein müsste. Guckst es dir im Debugger an, dort steht dann bei response.Positive auch true, denkst dir, hmm eigentlich müsste der Vergleich true = true auch true geben, aber nein er ergibt false! Lange rumgerätselt, dann mal zu nem int gecastet und schon stand da -1 = 1 und das ergibt natürlich false.

Also das musst du jedenfalls beachten wenn du nur nen Bit hast als boolschen Wert, da kann man dann schlecht die -1 darstellen.

Baka wa shinanakya naoranai.

Mein XING Profil.

L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 18 Jahren

@sheitman

Ist mir schon klar, dass wir hier in einem C# Forum sind, aber das Topic lautet ja hier "Rund um die Programmierung" - und Programmierung ist eben nicht nur C# - ja es gibt noch was anderes als das .NET-Framework auf der Welt 😉

@talla

Das mit dem -1 bei VB 6 war mir zwar bewusst, ich hab da aber noch nie bewusst ein Problem mit gehabt. Wenn ich aus ner stinknormalen C++ DLL einen bool auf VB 6 Seite kriege, behaupte ich mal, das funktioniert ohne Probleme. Dasselbe gilt für C++ -> C#, funktioniert auch problemlos.

Aber die spezielle dll um die es geht ist nun mal eine C-DLL, keine C++ DLL und da scheint es wohl einen Unterschied zu geben.

Ich werd mal nachforschen, was da genau los ist. Denn auch wenn der ANSI C-Bool nur 0 oder 1 sein kann, verstehe ich trotzdem nicht ganz, warum er auf C# Seite immer als true interpretiert wird, selbst wenn der Zahlenwert nach dem Marshalling 0 (also false) ist.

"It is not wise to be wise" - Sun Tzu

S
1.047 Beiträge seit 2005
vor 18 Jahren

Original von Lynix
@sheitman

Ist mir schon klar, dass wir hier in einem C# Forum sind, aber das Topic lautet ja hier "Rund um die Programmierung" - und Programmierung ist eben nicht nur C# - ja es gibt noch was anderes als das .NET-Framework auf der Welt 😉

dann ist ja gut 🙂
wollte ja nur darauf hinweisen das es recht schwer sein könnte zu dem problem eine antwort zu bekommen... aber hat sich ja jmd gefunden 🙂

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo zusammen,

ich hatte konkret noch nie einen solchen Fall.

Sollte ich aber irgendwann mal in den Genuß kommen, dann würde ich die Sache folgendermaßen angehen:

Marshall des C-Bool Wertes in einen C#-Integer (oder Cast, keine Ahnung ob das so überhaupt geht).
Danach nicht auf TRUE prüfen, sondern auf FALSE, denn FALSE ist meiner Meinung nach immer 0, egal in welcher Programmiersprache...

Damit sollte es doch lösbar sein, oder?

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 18 Jahren

Genauso hatte ich mir das auch gedacht, aber dem ist NICHT so !

Ich hab nochmal etwas weiter rumgetestet :

Beim Marshalling des Bool-Typen auf einen integer (oder einen C#-bool Typ) scheint irgendwas schief zu laufen, denn es steht nachher definitiv NICHT 0 in der Variablen auf C#-Seite, sondern irgend ein zufälliger Wert, der immer zu true ausgewertet wird.

Es klappt wirklich nur, wenn man den bool-Wert auf C# Seite als 1-bit Zahl marshallt (UnamangedType.I1). Ist halt schon ein Stückchen Arbeit, auf so etwas überhaupt mal zu kommen bei der Fehlersuche...

"It is not wise to be wise" - Sun Tzu

M
68 Beiträge seit 2005
vor 18 Jahren

Also jetzt will ich aber auch meinen Senf dazu geben:

Meiner Meinung nach gibt es erstmal garkeinen Ansi C bool Typ.
Ich denke mal das das in der windows.h einfach mal ein #define ist. Zumindest habe ich das so gelernt. Wie der entsprechende Header bei anderen Systemen heisst weiß ich net.

Aber viel tut das ja nicht zur Sache, außer das man dann evtl. die Definition auch ändern könnte 😉
In C++ und C# gibt es natürlich einen bool Datentyp.

Das wolte ich nur am Rande mal angemerkt haben, weil mich der Titel etwas verwirrt hat.

mfg fabian

6.862 Beiträge seit 2003
vor 18 Jahren

Sind alte Informationen die du hast, schau mal nachm C99 Standard.

Baka wa shinanakya naoranai.

Mein XING Profil.

M
68 Beiträge seit 2005
vor 18 Jahren

Ohh dankeschön, das ist dann jetzt schon das zweite mal das unser Lehrer uns veraltetes Zeug erzählt hat. Das ärgert mich schon, zumal das ein Doktoranwärter ist für Informatik.

Okay also in Zukunft alles prüfen was er sagt. So viel wird er mir ja zum Glück nicht mehr sagen können, ab März habe ich einen neuen Lehrer (aber dann auch C++ und C#, endlich).

mfg Fabian