MFC リソース ファイル内の STRINGTABLE がどのように正確に定義され、手動で展開できるかを説明する説明またはリンクを提供できる人はいますか?
私はそれをやろうとしましたが、マルチプロジェクトソリューションでは失敗しました。上記のソリューションのほとんどのプロジェクトには、独自のリソース ファイルがあり、名前が resource.h-files に変更されています。
アプリケーションが文字列リソースにアクセスしようとすると、「'22392' のリソース文字列が見つかりません」というエラー メッセージが表示されます。22392 は、作成しようとした文字列の ID です。代わりに定義済みの文字列 ID を使用すると、同様のエラー メッセージは表示されません。
Visual Studio 2010 のウィザードを使用して文字列リソースを追加しても機能しませんでした。ただし、リソース シンボルのリストと文字列テーブル エディターでは正しく表示されます。
言うまでもなく、私はこのソリューションの作成に参加していません。
ご協力いただきありがとうございます。
[編集1]
使用される値に対して「ファイル内の検索」を実行し、他の値も使用することにより、競合の可能性を排除しました:22390、22391、22393、22394、22395。常に同じ結果が得られました。
[編集2]
複雑なソリューションで行った手順を、新しくクリーンでシンプルな MFC アプリケーションの 1 つのプロジェクトで繰り返したところ、問題なく動作しました。したがって、私の問題は、ソリューションに複数のプロジェクトとリソースがあるという事実に関連していると思います。
手順は次のとおりです。
- resource.h (私の場合は別の名前です) でフリー番号を選択し、 #define IDS_XXXフリー番号を追加します。
- 「ファイル内検索」を実行して、選択した番号を検証します。
resource.h の STRINGTABLE に、できれば IDS_ の近くに、選択した値に近い値の行を追加します。
STRINGTABLE BEGIN IDS_OTHER "I have a number close to XXX" IDS_XXX "HelloHello" END
アプリケーションで文字列にアクセスします。
CString strMyString; strMyString.LoadString(IDS_XXX); AfxMessageBox(strMyString, MB_YESNO | MB_ICONEXCLAMATION);
[編集3]
エラー メッセージの原因となる LoadString の呼び出しを特定しようとしました。文字列リソースの読み込みに失敗した LoadString はクラスにあり、その文字列リソースを含むリソース ファイル (.rc) と同じプロジェクトにあります。「'22392' のリソース文字列が見つかりません」というエラー メッセージが生成されます。それは少なくとも、私がそれをググっても何も見つからなかった理由を説明しています.
[EDIT4]
さらに原因を切り分けることができました。
cstringt.h では hInst は NULL であり、文字列 ressource が見つかりません:
_Check_return_ BOOL LoadString(_In_ UINT nID)
{
HINSTANCE hInst = StringTraits::FindStringResourceInstance( nID );
if( hInst == NULL )
{
return( FALSE ); // goes here, but shouldn't, hInst == NULL
}
return( LoadString( hInst, nID ) );
}
同じリソース ファイル内の別の文字列リソースに問題なくアクセスできるため、これは奇妙です。