2009-06-09 11 views
2

私は(最近)WinFormsアプリケーションで主に使用されているActiveXコントロールを開発しています。複数のCOMCTL32.dllをプロセスにロードできますか?

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

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

残念ながら、WinFormsアプリケーションを実行すると、COMCTL32.DLLバージョン5.xxxがロードされて使用されます。その結果、プロパティページのダイアログが表示されたとき、アイコンが見えなくなります(半透明の領域は黒で塗りつぶされます)。

私の質問は:COMCTL32.dllバージョン6.0+をActiveXコントロールのプロパティページのUI内から使用する方法はありますか?または、ホストプロセスにバージョン6.0を使用させることができますか?私は、ホストプロセスがCOMCTL32.DLLをActiveXコントロール内のコードの前にメモリにロードしている可能性があると考えているため、そうは思わないので、COMCTL32 6.0を使用するためのシナリオはいくつかカバーしていますが、状況はありません。 。

答えて

2

元MSDN記事は私を混乱させました。特定のシナリオのいくつかに焦点を当てていたからです。そのうちのどれも私のものとは一致しませんでした。ラリー。

adding a 'manifest' xml fileリソースをActiveX DLLに送信すると、そのDLLにCOMCTL32.DLL 6.xを使用させるサイドバイサイドシステムに信号を送ることができます。そのバージョンは自動的にロードされます。かなりいい。

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

ここでの成功の証拠(同じDLLの2つのバージョンが同じプロセスにロードされた!)です: procexp screenshot showing two COMCTL32's loaded in process

は(また、アイコンがリストボックスで正しく表示;)

0

でアプリケーションが(メッセージループを開始するために一般的に)Application.Runを(呼び出す前)Application.EnableVisualStyles()を呼び出した場合、コモンコントロールライブラリのバージョン6+を使用する必要があります。

+0

うん、私はこれを他の場所で読んでいます。それはそうであり、そうではありません。奇妙な! – mackenir

関連する問題