Seite 1 von 2

bool an c dll übergeben

Verfasst: 07.02.2012 00:01
von Caliban
Hallo,

muss man beim übergeben eines bool Wertes an eine C dll etwas spezielles beachten.
Bei meinenen Wraper kommte es nämlich zu fehlern wenn ich #False übergebe.

Re: bool an c dll übergeben

Verfasst: 07.02.2012 01:54
von NicTheQuick
Welchen PB-Datentyp hast du den für bool genommen? Wenn ich mich nicht irre sind bools in C nichts anderes wie Integer in PB.

Re: bool an c dll übergeben

Verfasst: 07.02.2012 10:32
von DarkDragon
NicTheQuick hat geschrieben:Welchen PB-Datentyp hast du den für bool genommen? Wenn ich mich nicht irre sind bools in C nichts anderes wie Integer in PB.
Hierbei ist aber zwischen BOOL und bool zu unterscheiden. Ersteres ist glaube ich ein long in PB (sofern Windows Header verwendet werden), zweiteres ein byte.

Re: bool an c dll übergeben

Verfasst: 07.02.2012 16:59
von Caliban
Danke für euere Antworten, habe es jetzt auf .l umgestellt und jetzt scheint es zu funktionieren.

Re: bool an c dll übergeben

Verfasst: 08.02.2012 08:30
von Danilo
DarkDragon hat geschrieben:Hierbei ist aber zwischen BOOL und bool zu unterscheiden. Ersteres ist glaube ich ein long in PB (sofern Windows Header verwendet werden), zweiteres ein byte.
Das ist richtig, wobei man noch hinzufügen kann, dass BOOL kein Datentyp von C oder C++ ist,
sondern nur ein typedef in WinDef.h:

Code: Alles auswählen

typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float               FLOAT;
typedef int                 INT;
typedef unsigned int        UINT;
bool dagegen ist ein eingebauter Datentyp in C und ist in VC++ 1 Byte. MSDN erklärt dazu:
bool (C++) hat geschrieben:Microsoft Specific

In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1.
Ist eigentlich ganz einfach. Allerdings kommen dazu noch die Aufrufkonventionen (Calling conventions)
von Windows, und die sagen aus das Datentypen kleiner 32bit (also z.b. Bytes und Words) bei der
Übergabe an eine Funktion auf 32bit erweitert werden. Es wird also kein Byte oder Word auf den
Stack gelegt, sondern ein 32bit-Wert.

Wenn PB nun ein Byte in ein 8-bit-Register legt und dann das entsprechende 32bit-Register auf
den Stack pusht, löscht es dabei scheinbar nicht die oberen Bits des 32bit-Registers, so dass
diese undefiniert sind. Ich habe mir das jetzt nicht im ASM angeschaut, aber ich denke das ist
die Erklärung warum Du ein #False übergibst aber trotzdem ein true (also alles andere als 0)
herauskommen kann.
In dem Falle ist es also richtig dann in PureBasic .l für die Funktionsdeklaration zu nehmen.
Ansonsten bleibt das bool aber ein Byte, z.b. in Strukturen.

Re: bool an c dll übergeben

Verfasst: 08.02.2012 10:31
von mk-soft
Purebasic #True = +1 (Hex $00000001)
C oder C++ True = -1 (Hex $FFFFFFFF)
Variant True = (word) -1 (Hex $FFFF)

Re: bool an c dll übergeben

Verfasst: 08.02.2012 11:11
von Danilo
@mk-soft:
Diese Werte können von Compiler zu Compiler auf unterschiedlichen Platformen anders sein.
Auf Windows mit Visual C++ sind Deine Informationen falsch. (Caliban macht einen Import oder Wrapper für eine VC++ DLL)

Wieder aus MSDN und dem selben Topic:
bool (c++) hat geschrieben:An r-value of type bool can be converted to an r-value of type int, with false becoming zero and true becoming one.
Das kannst Du mit VC++ auch überprüfen:

Code: Alles auswählen

    bool x = true;
    std::cout << (int)x << std::endl;  // ausgabe: 1
    std::cout << x << std::endl;       // ausgabe: 1
    x = false;
    std::cout << (int)x << std::endl;  // ausgabe: 0
    std::cout << x << std::endl;       // ausgabe: 0
Und der Vollständigkeit halber noch die WinAPI-Defines aus WinDef.h, aber die haben mit
dem Datentyp bool nichts zu tun:

Code: Alles auswählen

#define FALSE               0
#define TRUE                1

Re: bool an c dll übergeben

Verfasst: 08.02.2012 11:52
von mk-soft
Also auf ungleich null prüfen was auch normal ist.

Die bis jetzt von mir verwendeten dll´s hatten mir mir immer '-1' geliefert...

:wink:

Re: bool an c dll übergeben

Verfasst: 08.02.2012 12:05
von Danilo
mk-soft hat geschrieben:Also auf ungleich null prüfen was auch normal ist.
Ja, das ist das Beste. false = 0 und alles andere ist true.

Code: Alles auswählen

If a
    ; true
Else
    ; false
EndIf
oder

Code: Alles auswählen

If Not a
    ; false
Else
    ; true
EndIf

Re: bool an c dll übergeben

Verfasst: 08.02.2012 14:28
von DarkDragon
Danilo hat geschrieben:
DarkDragon hat geschrieben:Hierbei ist aber zwischen BOOL und bool zu unterscheiden. Ersteres ist glaube ich ein long in PB (sofern Windows Header verwendet werden), zweiteres ein byte.
Das ist richtig, wobei man noch hinzufügen kann, dass BOOL kein Datentyp von C oder C++ ist,
sondern nur ein typedef in WinDef.h
Hier gibt es eine halbwegs vollständige, aber etwas fehlerhafte Liste: http://msdn.microsoft.com/en-us/library ... s.85).aspx

Besonders die Tatsache, dass HRESULT auch auf 64bit nur 32bit groß ist hat mich anfangs verwundert, weil das H bekanntlich für HANDLE steht und HANDLE eben ein Pointer Datentyp ist. Aber HRESULT ist garkein HANDLE.

In den Kommentaren im Link oben fand ich auch noch diese Liste:
https://docs.google.com/spreadsheet/ccc ... jQmc#gid=0