1

COMCTL32.DLLバージョン5.82.7601.17514で1回、バージョン6.10.7601.17514で1回、2回ロードされるプロセス内で実行しています。レガシー バージョンは、プログラムがリンクされているレガシー DLL によってロードされ、他のバージョンは新しい DLL によってロードされます。

私が使用する場合GetModuleHandle (L"COMCTL32.DLL")、解決されるDLLを制御できません。

GetProcAddressたとえば、reachを呼び出すとTaskDialogIndirect、null ポインターが返されます。これは、レガシー DLL のハンドルを取得したためです。

TaskDialogIndirectそれで、両方のDLLがロードされたときなど、アドレスに到達する手段はありますか。

そうでない場合、従来の DLL が の新しいバージョンで正常に動作することを期待して、プロセスが 5.82 ではなく 6.10 バージョンをロードすることを確認できますCOMCTL32か?

4

1 に答える 1

5

GetProcAddress()タスクダイアログが利用できないXPでアプリを実行したいので、暗黙的なリンクではなく使用する必要があると思います。

次の 3 つのオプションが表示されます。

  1. 暗黙的なリンクを使用しますが、MS ツール チェーンでサポートされている遅延読み込みを使用します。正しい comctl32 が得られるとは 100% 確信が持てませんが、試してみる価値はあります。
  2. アクティベーション コンテキスト APIを使用して、 を呼び出すときに comctl32 v6 マニフェストが有効であることを確認しますLoadLibrary()。マニフェストの魔法を確実に取得するためLoadLibrary()ではなく、呼び出します。GetModuleHandle()
  3. プロセス内のすべてのモジュールを列挙し、comctl32 の正しいバージョンを選択します。これを行う方法の包括的な例が MSDN にあります。

アクティベーション コンテキスト アプローチは最もクリーンなソリューションですが、アクティベーション コンテキスト API を使用するのは難しい場合があります。私は個人的にこれを使用して、Excel COM アドインが comctl32 v6 にリンクしていることを確認しました。

モジュール列挙アプローチは、実装が簡単で、やや汚れていますが、うまく機能します。

于 2011-08-31T16:28:09.840 に答える