コモンコントロールとはWindowsOSによって提供される基本的な機能を持ったウインドウ。ツリーやリストなど。コモンコントロールはバージョンアップが重ねられており、バージョンの違いでヘッダファイルにも違いが出る。開発環境と実行環境で違うバージョンがインストールされている場合もある。コモンコントロールはIEのインストールでバージョンアップされる。
https://msdn.microsoft.com/en-us/library/windows/desktop/hh298349(v=vs.85).aspx
1 2 3 4 |
5.81 Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5, and Microsoft Internet Explorer 6 5.82 Windows Server 2003, Windows Vista, Windows Server 2008, and Windows 7 6.0 Windows Server 2003 6.10 Windows Vista, Windows Server 2008, and Windows 7 |
実体
実体はComCtl32.dll。C:\Windows\System32\ComCtl32.dllにある。
ヘッダ
C言語のヘッダファイルでは_WIN32_IEにより、構造体などの定義が変わる。多くの構造体はそのサイズを持ち、この値がどんどん増えていく。この定数は_WIN32_WINNTの設定によって自動で設定される。_WIN32_WINNTを設定しなければ0x0500(version 5.80)になるようだ。SDKによって変わる。参照
コモンコントロールウインドウの作成
コモンコントロールのDLLがウインドウクラスを登録し、ユーザはこのクラスでCreateWindowExすることにより作成する。 InitCommonControlsEx()を呼ぶと、クラスの登録が行われるがDLLのロード時に行われるのかもしれない。
Visual Styles
Visual Stylesはコモンコントロールの表示スタイル(見栄え)を変える。
I18N
コモンコントロールの言語を変えるにはInitMUILanguage()を呼ぶ。
サイドバイサイド
ComCtrl32.dllはハードリンクされている。
1 2 3 4 5 6 7 8 9 10 |
>fsutil hardlink list c:\Windows\System32\comctl32.dll \Windows\WinSxS\amd64_microsoft-windows-shell-comctl32-v5_31bf3856ad364e35_10.0.16299.15_none_5c884af3491bf6a4\comctl32.dll \Windows\System32\comctl32.dll > >fsutil hardlink list c:\Windows\SysWOW64\comctl32.dll \Windows\SysWOW64\comctl32.dll \Windows\WinSxS\x86_microsoft-windows-shell-comctl32-v5_31bf3856ad364e35_10.0.16299.15_none_0069af6f90be856e\comctl32.dll > |
WinSxSはサイドバイサイドのアセンブリが置かれているところで長い名前はComCtrl32.dllのアセンブリアイデンティを表している。アプリケーションが特定のバージョンのdllを読み込みたい場合はマニフェストにこのアイデンティを指定する。
1 2 3 |
#pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") |
このpragmaのつけたexeを起動すると、C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.16299.371_none_5d75084fa7e1cb96\comctl32.dllが使われる。このファイルはハードリンクをこの1つしか持っていない。ver6のコモンコントロールを使うにはマニフェストで指定するしかないことになる。