3 Stimmen

bool versus BOOLEAN in verwalteten Prototypen

Ich versuche, einen verwalteten Prototyp in C# für die [CreateSymbolicLink][1] API-Funktion. Der Prototyp in WinBase.h lautet:

BOOLEAN APIENTRY CreateSymbolicLink (
    __in LPCWSTR lpSymlinkFileName,
    __in LPCWSTR lpTargetFileName,
    __in DWORD dwFlags
    );

Und BOOLEAN ist definiert als eine BYTE in WinNT.h. Nun gut. Also sollte mein verwalteter Prototyp sein:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CreateSymbolicLink(string SymlinkFileName, string TargetFileName, UInt32 Flags);

Zumindest würde ich das annehmen. bool ist nur ein Alias für System.Boolean , ein Ein-Byte-Wert. Aber es scheint nicht zu funktionieren.

Ich führe diesen Code aus:

bool retval = CreateSymbolicLink(LinkFilename, TargetFilename, 0);

Sie gibt zurück true . Aber der symbolische Link wird nicht erstellt. Der Grund dafür, dass er nicht erstellt wird, ist, dass ich nicht mit erhöhten Rechten arbeite. GetLastError gibt 1314 zurück, was laut WinError.h bedeutet, dass ich nicht über die erforderliche Berechtigung verfüge. Wie erwartet. Aber warum ist mein Rückgabewert true ?

Seltsamerweise, wenn ich den verwalteten Prototyp zu ändern:

static extern byte CreateSymbolicLink(string SymlinkFileName, string TargetFileName, UInt32 Flags);

und meinen Code zu:

byte retval = CreateSymbolicLink(LinkFilename, TargetFilename, 0);

Dann erhalte ich das erwartete Ergebnis: retval enthält 0, was bedeutet, dass die Funktion fehlgeschlagen ist.

Ich schätze, meine größere Frage ist, warum nicht bool Arbeit für BOOLEAN Rückgabewerte?

5voto

Ben M Punkte 21694

Markieren Sie den Rückgabewert mit einem entsprechenden MarshalAs Attribut:

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.U1)]
static extern bool CreateSymbolicLink(string SymlinkFileName, 
    string TargetFileName, UInt32 Flags);

Das Standard-Marshalling für bool von nativem zu verwaltetem Code ist 4 Byte - Sie haben wahrscheinlich true für Ihr ursprüngliches bool zurück, weil eines der falsch eingeordneten Stack-Bytes ungleich Null war. (Der letzte Teil ist nur eine Vermutung.)

1voto

JaredPar Punkte 699699

PInvoke mit booleschen Typen kann aufgrund der Unterschiede zwischen nativen und verwalteten bools unerwartete Ergebnisse liefern. Ich habe einen Blog-Artikel zu diesem Thema geschrieben, in dem die Unterschiede und die korrekte Art und Weise, die verschiedenen Typen zu marshalen, beschrieben werden

Ben M. hat in diesem Fall die richtige Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X