与PSECURITY_STRING不兼容

时间:2011-12-12 15:45:20

标签: c++ winapi sspi

我尝试使用http://msdn.microsoft.com/en-us/library/windows/desktop/aa380536(v=VS.85).aspx

中的代码

AcquireCredentialsHandle的行表示第二个参数与PSECURITY_STRING不兼容。谁知道我能在这做什么?

1 个答案:

答案 0 :(得分:1)

与大多数带有字符串参数的Win32 API函数一样,AcquireCredentialsHandle()映射到AcquireCredentialsHandleA()AcquireCredentialsHandleW(),具体取决于是否定义了UNICODE,因此它需要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本身。