0
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"String Not Found", 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に感謝します。

もう1つ質問です。MessageBox() がコードを機能させたのはなぜでしょうか?

4

3 に答える 3

0

関数からローカル変数のアドレスを返しているため、未定義の動作が発生します。

nn = temp; // when the function returns temp is out of scope
return nn; // and n is pointing at temp.

std::wstring代わりにa を返し、表現c_str()にアクセスするために使用しますconst wchar_t*

于 2012-12-13T14:50:31.360 に答える
0

おそらく問題は、GetString() がスタック上に配置されたバッファ ('temp' ローカル変数) へのポインタを返すことです。技術的には、リターン後のバッファは無効です

于 2012-12-13T14:54:07.430 に答える