Есть несколько очевидных вещей, которые не так с вашим кодом ...
1) прототип для ConvertSidToStringSid()
равен BOOL ConvertSidToStringSid(PSID Sid, LPTSTR *StringSid)
; это означает, что ваш typedef должен быть typedef BOOL (WINAPI *tConvertSidToStringSid)(PSID,LPTSTR *);
2) вы просматриваете версию ANSI и передаете wchar_t * ... Вы должны либо найти версию широких символов ConvertSidToStringSid()
, либо, лучшее решение, ИМХО, найти ConvertSidToStringSid
и использовать TCHAR *
вместо wchar_t *
, поскольку это будет работать независимо от настроек компиляции Unicode и соответствует typedef.
3) наконец, из-за некорректного определения типа вам разрешено передавать неверный тип данных в функцию. Он хочет LPTSTR *
, а вы передаете ему LPTSTR
(ну, на самом деле вы передаете wchar_t *
... * LPTSTR
на самом деле является типом, поддерживающим юникод, который отображается на wchar_t *
, если вы используете широкие символы, но вызываемая функция хочет указатель на этот указатель, а не сам указатель.
Итак, фиксированный код:
typedef BOOL (WINAPI *tConvertSidToStringSid)(PSID,LPTSTR*);
tConvertSidToStringSid pConvertSidToStringSid=0;
HINSTANCE handle = ::LoadLibrary("Advapi32.dll");
pConvertSidToStringSid = (tConvertSidToStringSid) ::GetProcAddress(handle, #ConvertSidToStringSid);
if(pConvertSidToStringSid(Sid, &psz)){
return psz;
}
Обратите внимание на изменение typedef, изменение на вызов GetProcAddress (где мы используем # для преобразования имени функции в строку (которое будет либо ConvertSidToStringSidA, либо ConvertSidToStringSidW в зависимости от настроек юникода) и изменение для передачи адреса psz а не сам указатель.
И теперь ваша единственная проблема заключается в том, что вы потенциально можете пропустить этот psz, если не будете уверены, что освободите его в вызывающем абоненте с помощью вызова LocalFree()
.
Обратите внимание, что в зависимости от вызывающего кода вы можете преобразовать typedef в wchar_t **
вместо LPTSTR *
, а затем использовать версию ConvertSidToStringSidW, чтобы результат всегда был строкой широких символов.