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
使用して行を持っていましたが、これはエラーがどこにあるかを見つけるために分割されました。)className
tempName
上記のコードはVC2010Expressでコンパイルされますが、処理されない例外が発生します。行*className
を実行しようとすると、(おそらく)に「アクセス違反の書き込み」が発生しStringCchCopy
ます。
私はこれを行うことでこれを機能させることができます
className = new TCHAR[bufSize];
関数を呼び出す前に(その後に一致する delete[]
ものがあります)、関数を呼び出すたびに本当にそれを行う必要がありますか?
私は問題がどこにあるのかは理解していますが、それが実行可能な解決策を考え出すための私の努力を妨げている理由はわかりません。問題は、を使用してメモリを割り当てない限り、LPTSTRに(_stprintf_s
またはを介して)何かを入れることができないことであるように思われます。まったく同じサイズの初期値を割り当てようとしましたが、結果は同じであるため、メモリ割り当ては実際にはそれとは関係がないと思います。それでは、どういうわけか私のLPTSTRをTCHAR []にキャストしていますか?それがどのように可能かはわかりませんが、この段階では何でも信じています。StringCchCopy
new TCHAR[bufSize]
誰かが私が間違っていることを説明できますか?(または、少なくとも私の理解が間違っている場合。)そして、おそらく関連する質問は、なぜ私std::cout
が文字列の最初の文字だけを表示しているのかということです。