2

私は、(最近) 主に WinForms アプリで使用される ActiveX コントロールを開発しています。

ActiveX コントロールには「プロパティ ページ」ダイアログがあり、AxHost クラスの ShowPropertyPages メソッドを使用してプログラムで表示できます。これは、コントロールのプロパティを編集するために Visual Studio で表示できるカスタム UI です。

このプロパティ ページ ダイアログには、ImageList を使用してリスト項目の横にアイコンを表示する ListBox コントロールが含まれています。これらのアイコンは、32 ビットのアルファ混合ビットマップです。これらを正しく表示するには、COMCTL32.DLL のバージョン6.0以降を使用する必要があります。

残念ながら、WinForms アプリを実行すると、 COMCTL32.DLL バージョン5.xxxが読み込まれて使用されます。その結果、プロパティ ページ ダイアログが表示されると、アイコンの見栄えが悪くなります (半透明の領域が黒一色で表示されます)。

私の質問は、プロセスが何を使用しているかに関係なく、ActiveX コントロールのプロパティ ページ UI 内から COMCTL32.dll バージョン 6.0 以降を確実に使用できる方法はありますか? または、ホスト プロセスにバージョン 6.0 を使用させることはできますか? (そうではないと思います。なぜなら、ホスト プロセスが、ActiveX コントロール内のどのコードよりも前に、COMCTL32.DLL を既にメモリにロードしている可能性があるからです。

この Web ページでは、COMCTL32 6.0 を使用するいくつかのシナリオについて説明していますが、私がいる状況については説明していません。

4

2 に答える 2

2

元のMSDNの記事は、いくつかの特定のシナリオに焦点を当てていたため、私を混乱させましたが、どれも私のものとは一致しませんでした。実際、それが話している基盤となるテクノロジーは、より一般的に機能します。

「マニフェスト」xmlファイルリソースをActiveXDLLに追加することにより、そのDLLにCOMCTL32.DLL6.xを使用させたいことをサイドバイサイドシステムに通知できます。その後、そのバージョンが自動的にロードされます。かなりいい。

このマニフェストは、リソースタイプがRT_MANIFESTで、リソースIDが2である必要があります。

成功の証拠は次のとおりです(同じDLLの2つのバージョンが同じプロセスでロードされます!): 処理中にロードされた2つのCOMCTL32を示すprocexpスクリーンショット

(また、アイコンはリストボックスに正しく表示されます;)

于 2009-06-10T08:59:52.273 に答える