HMODULE m_LangDll;
wchar_t* GetString(const int StringID)
{
wchar_t* nn = {0};
if (m_LangDll)
{
wchar_t temp[2048];
if(::LoadString(m_LangDll, StringID, temp, 2048))
{
MessageBox(0, L"string found", 0, 0);
nn = temp;
return nn;
}
}
//assert(s.length() && _T("String not found!"));
return 0;
}
Этот код работает отлично. Возвращает строку, которую я хочу без проблем.
Если я удаляю MessageBox (0, L «Строка не найдена», 0, 0), это не так. Возвращает случайный символ. Я, очевидно, делаю что-то не так. Я просто не понимаю, как, казалось бы, не связанный вызов MessageBox (0,0,0,0) имеет какое-то влияние.
Я попытался заменить вызов MessageBox другим кодом. Как выделение большего количества wchar_t *, но, похоже, это как-то связано с вызовом MessageBox.
Я звоню GetString как …
MessageBox(0, GetString(101),L"HHHHH", 0);
и я получаю другую кучу бреда, когда я называю это как …
wchar_t* tempString = GetString(101);
MessageBox(0, tempString, 0, 0);
но оба эти способа работают до тех пор, пока я не закомментирую MessageBox () в GetString
[РЕДАКТИРОВАТЬ]Спасибо за ваши ответы, они все были очень полезны.
мой код сейчас
wchar_t* GetString(const int StringID)
{
wchar_t* nn = new wchar_t[2048];
if (m_LangDll)
{
if(::LoadString(m_LangDll, StringID, nn, 2048))
{
return nn;
}
}
delete [] nn;
//assert(s.length() && _T("String not found!"));
return 0;
}
спасибо neagoegab особенно.
Еще один вопрос. Почему MessageBox () заставил код работать?
Вы возвращаете адрес локальной переменной из функции, вызывая неопределенное поведение:
nn = temp; // when the function returns temp is out of scope
return nn; // and n is pointing at temp.
Вернуть std::wstring
вместо этого и использовать c_str()
чтобы получить доступ к const wchar_t*
представление.
Возможно, проблема в том, что GetString () возвращает указатель на буфер, расположенный в стеке (локальная переменная ‘temp’). Технически, буфер неверен после возврата
Ваша временная переменная находится в стеке … выделите ее в куче:
HMODULE m_LangDll;
wchar_t* GetString(const int StringID)
{
wchar_t* nn = new wchar_t[2048];
if (m_LangDll)
{
if(::LoadString(m_LangDll, StringID, nn, 2048))
{
MessageBox(0, L"string found", 0, 0);
nn = temp;
return nn;
}
}
delete [] nn;
//assert(s.length() && _T("String not found!"));
return 0;
}