none
サテライトDLL RRS feed

  • 質問

  • お世話になります。

    サテライトDLLを下記のURLをもとに作成しているのですが、挙動がおかしいの教えてください。
    http://msdn.microsoft.com/ja-jp/library/8fkteez0.aspx

    TestApp.exeのプロジェクト、TestAppJPN.DLLプロジェクトを作成して、
    TestAppJPN.DLLプロジェクト側には、TestAppのrcファイル、resフォルダをコピーしてリソースを追加しています。

    テストするために、ダイアログリース、ストリングテーブルの一部を変更して、TestAppJPN.DLLが読み込まれているかを
    確認し確かに読み込まれているようなのですが、

    リソースを修正してもすぐに反映されないときがあります。
    例えば、TestAppのメニューリソースを英語、TestAppJPN側を日本語にしているのですが
    TestAppJPN側のメニュー文字列を変更しても、起動してにメニューは日本語表示なのですが変更前のメニュー文字と同じだったりします。
    作成されたTestAppJPN.DLLのリソースをリソースビューアーで見たのですが、変更した文字列となっているようです。
    リビルドしても同じです。

    で、ストリングテーブルを少し変更して、ビルドすると変更したメニュー項目名が反映されたりします。

    現象は、メニューリソースが顕著に現れます。

    なぜでしょうか。

    2014年3月5日 6:16

回答

  • MFCですよね(確認)。
    リソース、特にツールバー、メニュー、などを編集してコンパイルした場合は、
    SetRegistryKey()で設定したレジストリの内容を破棄する必要があります。
    それを行っているにも関わらず、その現象が起きるのでしょうか(確認)。
    • 回答としてマーク Brillia 2014年3月6日 9:14
    2014年3月5日 7:46
  • この場合はレジストリの書き換え、ないし削除を行う必要があるわけですが、
    本質的にはインストーラがやるべきことだと考えられます。
    もちろん、アプリケーションからRegOpenKeyEx()、RegDeleteKey()などの
    レジストリ操作関数群を使用して操作も可能ですが、
    この場合、環境の変化を検知する仕組みを実装しなければなりません。
    • 回答としてマーク Brillia 2014年3月6日 9:15
    2014年3月6日 6:49

すべての返信

  • MFCですよね(確認)。
    リソース、特にツールバー、メニュー、などを編集してコンパイルした場合は、
    SetRegistryKey()で設定したレジストリの内容を破棄する必要があります。
    それを行っているにも関わらず、その現象が起きるのでしょうか(確認)。
    • 回答としてマーク Brillia 2014年3月6日 9:14
    2014年3月5日 7:46
  • 既に作成済みのウィンドウのメニューリソースを動的に変更した場合、

    CWnd::DrawMenuBar

    を明示的に呼ぶ必要があるはずですが、いかがでしょうか?


    2014年3月5日 23:57
  • ご返事ありがとうございます。

    使用しているライブラリはMFCです。

    でSetRegistryKey()で設定しているレジストリを削除することで反映しました。

    アプリケーションをバージョンアップした時に、例えばサテライトDLLだけの差し替えがあった場合、
    反映する方法ってあるのでしょうか。


    2014年3月6日 1:00
  • この場合はレジストリの書き換え、ないし削除を行う必要があるわけですが、
    本質的にはインストーラがやるべきことだと考えられます。
    もちろん、アプリケーションからRegOpenKeyEx()、RegDeleteKey()などの
    レジストリ操作関数群を使用して操作も可能ですが、
    この場合、環境の変化を検知する仕組みを実装しなければなりません。
    • 回答としてマーク Brillia 2014年3月6日 9:15
    2014年3月6日 6:49
  • ありがとうございます。

    理解できました。

    2014年3月6日 9:14