Я пытаюсь создать управляемый прототип в C # для функции API [CreateSymbolicLink][1]
. Прототип в WinBase.h:
BOOLEAN APIENTRY CreateSymbolicLink (
__in LPCWSTR lpSymlinkFileName,
__in LPCWSTR lpTargetFileName,
__in DWORD dwFlags
);
И BOOLEAN определяется как BYTE
в WinNT.h. Хорошо. Итак, мой управляемый прототип должен быть:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CreateSymbolicLink(string SymlinkFileName, string TargetFileName, UInt32 Flags);
По крайней мере, я бы так подумал. bool
это просто псевдоним для System.Boolean
, однобайтовое значение. Но, похоже, это не работает.
Я выполняю этот код:
bool retval = CreateSymbolicLink(LinkFilename, TargetFilename, 0);
Возвращает true
. Но символическая ссылка не создана. Причина, по которой он не создан, заключается в том, что я не работаю с повышенными привилегиями. GetLastError
возвращает 1314, что в соответствии с WinError.h означает, что у меня нет необходимых разрешений. Как и ожидалось. Но почему мое возвращаемое значение true
?
Любопытно, если я изменю управляемый прототип на:
static extern byte CreateSymbolicLink(string SymlinkFileName, string TargetFileName, UInt32 Flags);
и мой код:
byte retval = CreateSymbolicLink(LinkFilename, TargetFilename, 0);
Затем я получаю ожидаемый результат: retval
содержит 0, что означает, что функция не выполнена.
Наверное, мой главный вопрос: почему bool
не работает для BOOLEAN
возвращаемых значений?