1

MFC リソース ファイル内の STRINGTABLE がどのように正確に定義され、手動で展開できるかを説明する説明またはリンクを提供できる人はいますか?

私はそれをやろうとしましたが、マルチプロジェクトソリューションでは失敗しました。上記のソリューションのほとんどのプロジェクトには、独自のリソース ファイルがあり、名前が resource.h-files に変更されています。

アプリケーションが文字列リソースにアクセスしようとすると、「'22392' のリソース文字列が見つかりません」というエラー メッセージが表示されます。22392 は、作成しようとした文字列の ID です。代わりに定義済みの文字列 ID を使用すると、同様のエラー メッセージは表示されません。

Visual Studio 2010 のウィザードを使用して文字列リソースを追加しても機能しませんでした。ただし、リソース シンボルのリストと文字列テーブル エディターでは正しく表示されます。

言うまでもなく、私はこのソリューションの作成に参加していません。

ご協力いただきありがとうございます。

[編集1]

使用される値に対して「ファイル内の検索」を実行し、他の値も使用することにより、競合の可能性を排除しました:22390、22391、22393、22394、22395。常に同じ結果が得られました。

[編集2]

複雑なソリューションで行った手順を、新しくクリーンでシンプルな MFC アプリケーションの 1 つのプロジェクトで繰り返したところ、問題なく動作しました。したがって、私の問題は、ソリューションに複数のプロジェクトとリソースがあるという事実に関連していると思います。

手順は次のとおりです。

  1. resource.h (私の場合は別の名前です) でフリー番号を選択し、 #define IDS_XXXフリー番号を追加します。
  2. 「ファイル内検索」を実行して、選択した番号を検証します。
  3. resource.h の STRINGTABLE に、できれば IDS_ の近くに、選択した値に近い値の行を追加します。

    STRINGTABLE
    BEGIN
      IDS_OTHER          "I have a number close to XXX"
      IDS_XXX            "HelloHello"
    END
    
  4. アプリケーションで文字列にアクセスします。

    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 ) );
}

同じリソース ファイル内の別の文字列リソースに問題なくアクセスできるため、これは奇妙です。

4

2 に答える 2

1

「'22392' のリソース文字列が見つかりません」というエラーは、Windows が文字列テーブルでその特定の文字列を見つけることができないように聞こえますが、これは「リソース シンボルのリストと文字列テーブル エディターには正しく表示されます」というステートメントと競合します。問題を絞り込むために私が行うか確認するいくつかのこと:

  • プロジェクトまたはソリューション全体をクリーンアップ/再構築します。悪いビルドや古いビルドが原因で、VS の奇妙な動作があまりにも多く見られたので、通常はこれを最初に試します。
  • RC ファイルをテキスト エディターで編集します。RC ファイルを右クリックし、VS2010 で [コードを表示] をクリックします。文字列 22392 が実際に存在し、有効であることを確認します。その前後のエントリも確認してください。
  • 文字列テーブルと resource.h から文字列を削除します。リソース エディターから文字列を再作成します。
  • 「名前が変更されたresource.hファイル」について言及しています。何を言っているのか完全にはわかりませんが、これらが RC ファイルで適切に使用されていることを確認してください。テキスト エディターで見ると、先頭に含まれている必要があります。
  • 22392 の定義済みの名前がプロジェクト内の別の場所で再定義されていないことを確認してください。

文字列が文字列テーブルに存在し、それでも「見つかりません」というエラーが発生する場合は、何か他のことが起こっています。

于 2012-03-09T13:15:49.790 に答える
0

ID の定義は Resource.h にあります。おそらく、誰かが文字列を追加して Resource.h のエントリを削除した可能性があるため、エラー メッセージが表示されます。resource.h を開き、#define IDS_XXX 22392 を追加します。

于 2012-03-09T10:15:25.453 に答える