none
MFCスタティックリンクのマルチランゲージ

    質問

  • 英語版で作成した MainApp.exe を日本語対応するため、日本語リソースだけを格納した MainAppJPN.dll を作りました。
    MFCをスタティックリンクで利用しています。
    英語Windowsで実行させると問題ないのですが、日本語Windowsで実行させるとMFCリソースが見つけられず、アサートして終了してしまいます。
    試しに MainAppJPN.dll を削除して MainApp.exe を日本語Windowsで実行させると英語のリソースを使って正常に動作します。

    https://msdn.microsoft.com/ja-jp/library/x6h91d9w.aspx
    ↑ここで説明されている『上の手順は、MFC と静的にリンクするアプリケーションの場合に有効です。』の方法を試しているのですが、MFCのリソースが MainAppJPN.dll に取り込めなくて困っています。

    主な設定は、
    ・ダイナミックリンクライブラリ
    ・スタティックライブラリでMFCを使用する
    ・エントリポイントなし → はい(/NOENTRY)
    です。

    MainAppJPN プロジェクトのプロパティ → 構成プロパティ → リソース → コマンドライン に次の行を追加しました。

    /I"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\atlmfc\include\l.jpn"
    (私のインストール環境では、上記ディレクトリに MFC 日本語リソースがありました。)

    色々試してみたのですがMFCリソースを取り込めません。
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\atlmfc\include\l.jpn
    ↑にあるリソースを直接プロジェクトに追加してもみましたがエラーが出てしまい上手く行きません。

    ちなみにMFCをダイナミックリンクさせると、期待通りの動作を行います。

    MFCスタティックリンクでの解決方法をご存知であれば、どうか教えてください。

    よろしくお願いいたします。

    2017年11月30日 2:09

回答

  • 日本語リソース DLL の中に MFC のリソースが格納できていないようですね。日本語リソース DLL のプロジェクトフォルダにあるリソースファイル(*.rc)をテキストエディタで編集してみてはどうでしょうか?私の場合は英語のリソースファイル(*.rc)をコピーして下記の箇所を修正することで動作しました。

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
    LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
    
    ↓↓↓↓↓↓
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
    LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
    
    ...
    略
    ...
    
        "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
        "LANGUAGE 9, 1\r\n"
        "#include ""res\\MainApp.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
        "#include ""afxres.rc""      // 標準コンポーネント\r\n"
        "#if !defined(_AFXDLL)\r\n"
        "#include  ""afxribbon.rc""   // MFC リボンおよびコントロール バー リソース\r\n"
        "#endif\r\n"
        "#endif\r\n"
    
    ↓↓↓↓↓↓
    
        "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n"
        "LANGUAGE 17, 1\r\n"
        "#include ""res\\MainAppJPN.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
        "#include ""l.jpn\\afxres.rc""          // 標準のコンポーネント\r\n"
        "#if !defined(_AFXDLL)\r\n"
        "#include  ""l.jpn\\afxribbon.rc""   // MFC リボンおよびコントロール バー リソース\r\n"
        "#endif\r\n"
        "#endif\r\n"
    
    ...
    略
    ...
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
    LANGUAGE 9, 1
    #include "res\MainApp.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
    #include "afxres.rc"      // 標準コンポーネント
    #if !defined(_AFXDLL)
    #include  "afxribbon.rc"   // MFC リボンおよびコントロール バー リソース
    #endif
    #endif
    
    ↓↓↓↓↓↓
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
    LANGUAGE 17, 1
    #include "res\MainAppJPN.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
    #include "l.jpn\afxres.rc"          // 標準のコンポーネント
    #if !defined(_AFXDLL)
    #include  "l.jpn\afxribbon.rc"   // MFC リボンおよびコントロール バー リソース
    #endif
    #endif

    サンプルプロジェクト: https://github.com/kenjinote/MFC_MultiLanguage/archive/master.zip
    • 編集済み kenjinoteMVP 2017年11月30日 3:39
    • 回答としてマーク Rider2Go 2017年11月30日 4:17
    2017年11月30日 3:38

すべての返信

  • MainAppJPN.dll に必要な日本語リソースを含めることができないのでしょうか?それとも、日本語リソースは含むことができているものの、それが反映されないのでしょうか?

    前半部分では、リソースDLLを作ったがそれが利用されていないようだということが書かれていますが、

    後者では、リソースが取り込めていないと書かれています。

    意図したDLLが作れないのかそれとも、それとも意図したDLLは作られているがそれが利用されていないのかでは、まったく意味が違います。

    状況はどちらなのでしょうか?


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2017年11月30日 3:29
  • 日本語リソース DLL の中に MFC のリソースが格納できていないようですね。日本語リソース DLL のプロジェクトフォルダにあるリソースファイル(*.rc)をテキストエディタで編集してみてはどうでしょうか?私の場合は英語のリソースファイル(*.rc)をコピーして下記の箇所を修正することで動作しました。

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
    LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
    
    ↓↓↓↓↓↓
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
    LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
    
    ...
    略
    ...
    
        "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
        "LANGUAGE 9, 1\r\n"
        "#include ""res\\MainApp.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
        "#include ""afxres.rc""      // 標準コンポーネント\r\n"
        "#if !defined(_AFXDLL)\r\n"
        "#include  ""afxribbon.rc""   // MFC リボンおよびコントロール バー リソース\r\n"
        "#endif\r\n"
        "#endif\r\n"
    
    ↓↓↓↓↓↓
    
        "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n"
        "LANGUAGE 17, 1\r\n"
        "#include ""res\\MainAppJPN.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
        "#include ""l.jpn\\afxres.rc""          // 標準のコンポーネント\r\n"
        "#if !defined(_AFXDLL)\r\n"
        "#include  ""l.jpn\\afxribbon.rc""   // MFC リボンおよびコントロール バー リソース\r\n"
        "#endif\r\n"
        "#endif\r\n"
    
    ...
    略
    ...
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
    LANGUAGE 9, 1
    #include "res\MainApp.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
    #include "afxres.rc"      // 標準コンポーネント
    #if !defined(_AFXDLL)
    #include  "afxribbon.rc"   // MFC リボンおよびコントロール バー リソース
    #endif
    #endif
    
    ↓↓↓↓↓↓
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
    LANGUAGE 17, 1
    #include "res\MainAppJPN.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
    #include "l.jpn\afxres.rc"          // 標準のコンポーネント
    #if !defined(_AFXDLL)
    #include  "l.jpn\afxribbon.rc"   // MFC リボンおよびコントロール バー リソース
    #endif
    #endif

    サンプルプロジェクト: https://github.com/kenjinote/MFC_MultiLanguage/archive/master.zip
    • 編集済み kenjinoteMVP 2017年11月30日 3:39
    • 回答としてマーク Rider2Go 2017年11月30日 4:17
    2017年11月30日 3:38
  • ありがとうございます。
    試してみます。

    2017年11月30日 3:45
  • 上手くいきました。
    ありがとうございます!

    Visual Studio のリソースエディタでコピーしたリソースファイルを英語から日本語に変更は行っていたのですが、ご指摘と通りテキストエディタで開くと、完全に日本語化されていませんでした。

    お知らせいただいた内容で、修正したところ期待通りの動作ができました。

    LANGUAGE 9, 1 → 17, 1 の意味だけ分からなかったので、後で調べて自分のものにしたいと思います。

    とても助かりました。感謝いたします。
    2017年11月30日 4:17