兼容我試圖從http://msdn.microsoft.com/en-us/library/windows/desktop/aa380536(v=VS.85).aspx不PSECURITY_STRING
爲AcquireCredentialsHandle線使用代碼表示,第二個參數是不兼容PSECURITY_STRING。任何人都知道我可以在這裏做什麼?
兼容我試圖從http://msdn.microsoft.com/en-us/library/windows/desktop/aa380536(v=VS.85).aspx不PSECURITY_STRING
爲AcquireCredentialsHandle線使用代碼表示,第二個參數是不兼容PSECURITY_STRING。任何人都知道我可以在這裏做什麼?
喜歡與字符串參數,AcquireCredentialsHandle()
映射到要麼AcquireCredentialsHandleA()
或AcquireCredentialsHandleW()
取決於是否UNICODE
最Win32 API函數的定義,所以它分別預計char*
或wchar_t*
指針。另一方面,SECURITY_STRING
是在UNICODE_STRING
結構之後建模的結構 - 兩者均僅包含UTF-16編碼的Unicode數據。
要將SECURITY_STRING
值傳遞給AcquireCredentialsHandleA()
,您需要將SECURITY_STRING::Buffer
成員的內容先轉換爲ANSI:
PSECURITY_STRING str;
...
int len = WideCharToMultiByte(0, 0, (LPWSTR)str->Buffer, str->Length, NULL, 0, NULL, NULL);
std::string tmp(len);
WideCharToMultiByte(0, 0, (LPWSTR)str->Buffer, str->Length, &tmp[0], len, NULL, NULL);
AcquireCredentialsHandle(..., tmp.c_str(), ...);
要將SECURITY_STRING
值傳遞給AcquireCredentialsHandleW()
,你需要通過SECURITY_STRING::Buffer
成員原樣是:
PSECURITY_STRING str;
...
AcquireCredentialsHandle(..., (LPWSTR)str->Buffer, ...);
無論哪種方式,你不指針傳遞給SECURITY_STRING
本身。
只是對'SECURITY_STRING'的評論。 Buffer成員被聲明爲SECURITY_STRING文檔中的USHORT,UNICODE_STRING文檔中的PWSTR,以及sspi.h中的unsigned short *位模式)。可能是在64位模式下,「緩衝區」參數不被視爲指針,而是字符流的開始。 –
'SECURITY_STRING'的文檔包含另一個可能的錯誤。 「長度」和「最大長度」成員被認爲是以字節爲單位的大小,但真正的源頭包括MIDL信息,表明兩者都以寬字符表示大小。 –
'SECURITY_STRING :: Buffer'是一個指向UTF-16字符數組的指針。 'SECURITY_STRING'文件是錯誤的,它應該說'USHORT *'代替。就UTF-16而言,'USHORT *','unsigned short *'和'LPWSTR'都是相同的,並且可以在它們之間自由輸入,因爲它們都是16位的。至於'Length'和'MaximumLength',它們實際上是以字節表示的,而不是字符。 MIDL'size_is()'和'length_is()'屬性用數組元素表示。由於'Buffer'是一個UTF-16字符數組,因此MIDL聲明將「Length」和「MaximumLength」除以2. –
您可以傳遞兼容變量或將其轉換爲...但是,除非您向我們顯示您的代碼,否則我們無法告訴您您做錯了什麼。 – AJG85