2016年10月2日追記: Windows 8.1からこのサンプルでは動作しなくなってしまったようです。Windows Vista~7では動作します。Windows 8は未確認です。

Microsoft.Windows.ActCtxオブジェクトを使うと、レジストリに登録せずCOMコンポーネントが使えます。Activation Context APIのラッパーであり、WSHやHTAにおけるJScript/VBScriptなどのWindows APIを呼べない環境で重宝します。

用意するものは3つです。

  • 利用したいCOMコンポーネント本体(DLLなど)
  • マニフェストファイル
  • スクリプト本体

1つ目、サンプルのCOMコンポーネントを作りました: msgbox.cpp。Visual C++ 2010(Expressでも可)でコンパイルできます。Showというメソッドを1つ持った単純なオブジェクトがあります。正規にレジストリへ登録すれば、次のように使えるはずです。

Set msg = CreateObject("Egtra.MessageBox")
msg.Show

2つ目、マニフェストファイルを作り、スクリプト本体と同じフォルダに置きます。Windows XP がもたらす Visual Basic デベロッパーへの福音 ~ 第 2 回: 新しいサイド バイ サイド技術 ~を参考にしました。今回の例ではファイル名をEgtra.MessageBox.manifestとしました。これは1から書きましたが、既存のものの場合レジストリを見てマニフェストファイルに転記する作業になると思います。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="x86"
    name="Egtra.MessageBox"
    type="win32"/>
  <description>Reg-Free COM Test</description>
  <file name="MsgBox.dll">
    <comClass
      clsid="{AAC72E88-1A7B-41F3-A5C1-255093DB7431}"
      progid="Egtra.MessageBox"/>
  </file>
</assembly>

3つ目、スクリプトを書きます。Microsoft.Windows.ActCtxオブジェクトのメソッドCreateObjectを使用するのがミソです。

Set actCtx = CreateObject("Microsoft.Windows.ActCtx")
actCtx.Manifest = "Egtra.MessageBox.manifest"
 
Set mb = actCtx.CreateObject("Egtra.MessageBox")
mb.Show

なお、64ビットWindowsでWSHを使う場合、通常64ビット版CScript.exe/WScript.exeの元で実行されることに注意です。32ビットDLLのCOMコンポーネントを使用する場合、C:\Windows\SysWOW64フォルダにある32ビット版のCScript.exe/WScript.exeで実行させる必要があります。

この方法の欠点は、使用できるバージョンがWindows Server 2003からということです。Vista/7では使えますがXPではできません。

ググると「WScript.exeまたはCScript.exeを適当なディレクトリにコピーして、WScript.exe.manifestまたはCScript.exe.manifestを作成する」という方法の解説がよく見つかります。それを裏技とするなら、Microsoft.Windows.ActCtxは正攻法と言えるでしょう。


スポンサード リンク

この記事のカテゴリ

  • ⇒ Microsoft.Windows.ActCtxでWSHでもReg‐Free COM
  • ⇒ Microsoft.Windows.ActCtxでWSHでもReg‐Free COM
  • ⇒ Microsoft.Windows.ActCtxでWSHでもReg‐Free COM