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);
但只要我没有在GetString中注释掉MessageBox()
,这两种方式都有效[编辑]
感谢您的回复,他们都非常有帮助。
我的代码现在是
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 :(得分: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*
代表。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
也许,问题是GetString()返回指向堆栈上llocated缓冲区的指针('temp'局部变量)。从技术上讲,返回后缓冲区无效