0

LPTSTRと列挙値が提供され、値に基づいて文字列を作成し、それをLPTSTRに配置する関数が必要です。

列挙値でインデックス付けされた名前の配列を使用する次の関数を作成しました。

bool GetWinClassName(const int &WinType, LPTSTR *className, const int bufSize)
{
    bool allOk = true;
    LPTSTR tempName = new TCHAR[bufSize];
    _stprintf_s(tempName, bufSize, TEXT("Win%sClass"), g_WinNames[WinType]);
    std::cout << (char*)tempName << std::endl;
    if (FAILED(StringCchCopy(*className, (bufSize+1)*sizeof(TCHAR), tempName)))
    {
        allOk = false;
    }
    delete[] tempName;
    return allOk;
}

(元々 、代わりにを_stprintf_s使用して行を持っていましたが、これはエラーがどこにあるかを見つけるために分割されました。)classNametempName

上記のコードはVC2010Expressでコンパイルされますが、処理されない例外が発生します。行*classNameを実行しようとすると、(おそらく)に「アクセス違反の書き込み」が発生しStringCchCopyます。

私はこれを行うことでこれを機能させることができます

className = new TCHAR[bufSize];

関数を呼び出す前に(その後に一致する delete[]ものがあります)、関数を呼び出すたびに本当にそれを行う必要がありますか?

私は問題がどこにあるのかは理解していますが、それが実行可能な解決策を考え出すための私の努力を妨げている理由はわかりません。問題は、を使用してメモリを割り当てない限り、LPTSTRに(_stprintf_sまたはを介して)何かを入れることができないことであるように思われます。まったく同じサイズの初期値を割り当てようとしましたが、結果は同じであるため、メモリ割り当ては実際にはそれとは関係がないと思います。それでは、どういうわけか私のLPTSTRをTCHAR []にキャストしていますか?それがどのように可能かはわかりませんが、この段階では何​​でも信じています。StringCchCopynew TCHAR[bufSize]

誰かが私が間違っていることを説明できますか?(または、少なくとも私の理解が間違っている場合。)そして、おそらく関連する質問は、なぜ私std::coutが文字列の最初の文字だけを表示しているのかということです。

4

2 に答える 2

1
wstring winClassName( int const winType )
{
    return wstring( L"Win" ) + g_WinNames[winType] + L"Class";
}

しかし、なぜあなたがそのグローバルな名前の配列などを持っているのか、私は完全に困惑しています。それはおそらく設計レベルのエラーです。

于 2013-02-10T13:01:46.407 に答える
0

関数を呼び出すたびに本当にそれを行う必要がありますか?

LPTSTR値は文字列オブジェクトではなく、単にTCHARへのポインタです。バッファを割り当てない場合、キャラクターはどこに行くと思いますか?classNameポインタ引数が、書き込み可能なメモリバッファを指していることを確認する必要があります。毎回新しいバッファを割り当てるかどうかはあなた次第です。

Alfが示唆しているように、より良い代替策は、ポインタと動的に割り当てられた配列の直接使用を完全に避け、文字列オブジェクトを返すことです。

std :: coutに文字列の最初の文字しか表示されないのはなぜですか?

UNICODEが定義されている場合は、代わりにstd::wcoutを使用してください。

于 2013-02-10T13:11:51.130 に答える