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?