とりあえず、manifestファイルでどうのこうのする技術のことは「サイドバイサイドアセンブリ」 (side-by-side assemblies)と呼べばよいようです。そして、.localなどそれ以外の関連技術を含んだ広い言葉が「サイドバイサイドコンポーネント共有」 (Side-by-Side Component Sharing)であるようです。

XPスタイルとクラシックスタイルの混在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で挟んでいたというわけです。

スポンサード リンク

この記事のカテゴリ

  • ⇒ アクティベーションコンテキスト
  • ⇒ アクティベーションコンテキスト