none
RCファイルの仕様について RRS feed

  • 質問

  • お世話になります。

    VC++2010を使用しております。

    プロジェクト作成時にリソースファイルを「米国」で作成すると、リソースファイルは、

       "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
        "LANGUAGE 9, 1\r\n"

    の条件がはいったものとなります。

    で、ダイアログを新規作成するとデフォルトでは、Languageが日本語となり、
    RCファイルを確認すると、

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
    LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT

    が追加され、ダイアログリソースのコードが実装されます。

    この時点で米国と日本が混在したリソースとなっておりコンパイルし、アプリケーションを実行すると、

    IDS_EDIT_MENU

    がないとエラーが発生します。
    IDS_EDIT_MENUは、英語(   "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n")

    で囲まれたほうにしかないので、ということは、

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)の側がコンパイルされたように見えます。

    ただ、日本語(AFX_TARG_JPN)の部分を削除することで、起動することが可能になります。

    これらのコンパイル条件がどうのようなっているのかを教えてほしいのですが、
    AFX_TARG_JPNやAFX_TARG_ENUはどこで定義しているのか、切り替えが可能なのかを教えてください。

    RCファイルのプロパティで、カルチャ項目化と思っていたのですが、「英語(米国)409・・」となっているので、関係なさそうです。

    よろしくお願いします。

    2014年6月27日 8:00

回答

  • MFCアプリケーションプロジェクトをベースに開発されているものだと仮定して話を進めます。

    AFX_RESOURCE_DLLおよびAFX_TARG_XXXは、通常のMFCアプリケーションプロジェクトやDLLプロジェクトでは自動定義されません。AFX_RESOURCE_DLLが定義されていないので、複数の言語のリソースをEXEに含める場合、プリプロセッサにしたがって、すべてがコンパイルされて実行モジュール内に含められるようになります。

    シンボルの定義状況が実際のところどうなっているのかを確認したければ、リソーススクリプトの該当プリプロセッサブロック直前に下記のような確認用のコードを追加してコンパイルしてみれば分かるでしょう(エラーになるはずです)。

    #ifndef AFX_TARG_JPN
    #error
    #endif
    

    確かMFCフレームワークはアプリケーション起動時に、複数の言語のリソースがモジュール内に含まれる場合、OSの言語設定を見てどのリソースを使うかを自動的に決めていたと記憶しています。

    MFCではプログラムコードの含まれるEXEやDLLに、すべての言語リソースを含めてローカライズする方法と、.NETのように言語ごとのリソースのみを格納したサテライトDLLを用意する方法があります。サテライトDLL方式を使うと、OSの言語設定に関わらず明示的に言語を指定してローカライズすることもできるようになります(そのためには明示的にDLLをロードするコードを書く必要もありますが)。AFX_RESOURCE_DLLはサテライトDLLを作成するときに開発者が明示的に定義するシンボルです。詳しくは下記を参考に。

    How To Create Localized Resource DLLs for MFC Application

    • 回答としてマーク 星 睦美 2014年11月5日 7:33
    2014年8月2日 15:42