【发布时间】:2015-03-19 05:10:42
【问题描述】:
今天我可以写a simple C++ program that granted a user the "Log on as a service" privilege。其中一部分涉及在LPCWSTR 和LSA_UNICODE_STRING 之间进行转换。执行此操作的代码在这里:
LSA_UNICODE_STRING StringToLsaUnicodeString(LPCWSTR string) {
LSA_UNICODE_STRING lsaString;
DWORD dwLen = 0;
dwLen = wcslen(string);
lsaString.Buffer = (LPWSTR) string;
lsaString.Length = (USHORT)((dwLen) * sizeof(WCHAR));
lsaString.MaximumLength = (USHORT)((dwLen + 1) * sizeof(WCHAR));
return lsaString;
}
当我在这个函数中出现一些小错误时,我对LsaLookupNames2() 的调用失败,代码为 87(hex 0x57)“参数不正确。”我正在尝试在使用 std::wstring 的 C++ 应用程序中进行此调用,但它失败了。我目前的功能如下:
#if defined(_UNICODE)
LSA_UNICODE_STRING toLsaUnicodeString (std::wstring str) {
LSA_UNICODE_STRING lsaWStr;
DWORD len = 0;
LPWSTR cstr = (LPWSTR)str.c_str();
len = wcslen(cstr);
lsaWStr.Buffer = cstr;
lsaWStr.Length = (USHORT)((len) * sizeof(WCHAR));
lsaWStr.MaximumLength = (USHORT)((len + 1) * sizeof(WCHAR));
return lsaWStr;
}
#endif
我做错了什么?
【问题讨论】:
-
您不需要
#if defined(_UNICODE)。无论如何,代码都是正确的。 -
要添加到 MSSalters 的评论中,最好通过 const 引用(即:const std::wstring & str)而不是值来传递 std::wstring 的实例,以避免无用的 deep-副本。
标签: c++ winapi unicode wstring local-security-authority