Получение строки из таблицы строк DLL

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 () заставил код работать?

0

Решение

Вы возвращаете адрес локальной переменной из функции, вызывая неопределенное поведение:

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* представление.

0

Другие решения

Возможно, проблема в том, что GetString () возвращает указатель на буфер, расположенный в стеке (локальная переменная ‘temp’). Технически, буфер неверен после возврата

0

Ваша временная переменная находится в стеке … выделите ее в куче:

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;
}
0
По вопросам рекламы [email protected]