Вы, вероятно, столкнулись с пожизненной проблемой с wchar_t*
, возвращенным с str.c_str()
. str.c_str()
вернет указатель на базовую строку, время жизни которой определяется str
. Поскольку str
передается по значению, оно будет уничтожено в конце функции toLsaUnicodeString
, в результате чего возвращенный LSA_UNICODE_STRING
будет указывать на память, которая была освобождена. Чтобы избежать этого, вам нужно будет сделать копию базовой строки в функции toLsaUnicodeString
и связать копию с возвращенным LSA_UNICODE_STRING
, что-то вроде:
LSA_UNICODE_STRING toLsaUnicodeString (const std::wstring& str) {
LSA_UNICODE_STRING lsaWStr;
DWORD len = 0;
len = str.length();
LPWSTR cstr = new WCHAR[len + 1];
memcpy(cstr, str.c_str(), (len + 1) * sizeof(WCHAR));
lsaWStr.Buffer = cstr;
lsaWStr.Length = (USHORT)((len) * sizeof(WCHAR));
lsaWStr.MaximumLength = (USHORT)((len + 1) * sizeof(WCHAR));
return lsaWStr;
}
Поскольку память теперь выделена в куче, вы несете ответственность за ее освобождение. Вы можете использовать функцию, подобную следующей, чтобы позаботиться об этом.
void freeLsaUnicodeString(LSA_UNICODE_STRING& str) {
delete [] str.Buffer;
str.Buffer = 0;
str.Length = 0;
str.MaximumLength = 0;
}
Еще лучше было бы использовать RAII для управления памятью и гарантировать ее освобождение, когда переменная больше не используется. Подробности об этом подходе см. В ответе Mr_C64.