とりあえず、manifestファイルでどうのこうのする技術のことは「サイドバイサイドアセンブリ」 (side-by-side assemblies)と呼べばよいようです。そして、.localなどそれ以外の関連技術を含んだ広い言葉が「サイドバイサイドコンポーネント共有」 (Side-by-Side Component Sharing)であるようです。
XPスタイルとクラシックスタイルのコントロールを1プロセスで混ぜて両方使う方法がようやく分かりました。図中のボタン1、ボタン3、ボタン5はSystem32にあるcomctl32.dllバージョン5を使い、ボタン2、ボタン4はマニフェストを指定してWinSxS以下にあるcomctl32.dllバージョン6を使っています。
これにはアクティベーションコンテキストAPIを使っています。これを使うと、後からマニフェストを読み込んだり、それを好きなときに使用したりなどといったことが可能です。説明は要らないというのであれば、直接ソースコードをどうぞ。
アクティベーションコンテキストとは、MSDNライブラリによればどのDLLを読み込むかなどの情報を記したデータ構造とあります。
実際に使う側からすればハンドルです。
Dim ac As ACTCTX, hActCtx As HANDLE
With ac
.cbSize = Len(ac)
.lpSource = "XPThemes.manifest"
End With
hActCtx = CreateActCtx(ac)
まず、アクティベーションコンテキストのハンドルを作ります。HANDLE型ですがカーネルハンドルではなく、CloseHandleは使えません(ReleaseActCtxを使います)。ACTCTX構造体は主にマニフェストを指定するためのものです。ここではファイルを指定しましたが、EXE/DLLリソースの指定なども可能です。個人的にはなんでメモリ上のデータからハンドルを作れないのかが不思議です、あまり使われないかもしれませんが。
ちなみにXPThemes.manifestは次の通りです。”C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\XPThemes.manifest”を大いに参考にしました(同一ではありません)。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly> |
ハンドルを作ったら、それを有効化します。
Dim cookie As ULONG_PTR
CreateButton(wcx.hInstance, hwnd, 1, hfnt)
If ActivateActCtx(hActCtx, cookie) = FALSE Then FailedToActivate()
CreateButton(wcx.hInstance, hwnd, 2, hfnt)
DeactivateActCtx(0, cookie)
ハンドルが指すコンテキストを有効化するにはActivateActCtxを使い、終わったらDeactivateActCtxを呼びます。cookieは引換券なので大事にしましょう。FailedToActivateはエラー表示など、CreateButtonはCreateWindowExを呼んでボタンを作る処理が入っています。hwndは親ウィンドウのハンドルです。上のコードではコンテキストが有効化された2ではXPスタイル、そこにかかっていない1はクラシックスタイルのボタンが作られるというわけです。図のプログラムでは、2と4のボタン作成部分をXPStyleマニフェストのActivateActCtx/DeactivateActCtxで挟んでいたというわけです。
スポンサード リンク |