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は正攻法と言えるでしょう。
スポンサード リンク |
regfree com がマニフェストファイルで実現できるとのことで、こちらにたどり着いた者です。
C#で適当なクラスライブラリdll(com相互機能モード)を作成し、他の人間のPCへvbs、マニフェストファイル、dllを渡し、vbsを実行したところ「ActiveXコンポーネントはオブジェクトを作成できません」
というエラーになってしまいます。
例で言うところの「Set mb ~」の箇所でエラーが発生しているので、エラーメッセージの通りということになると思うのですが、考えられる原因はどのようなものがあるでしょうか?
ちなみに当然ですが、dllを吐き出す時点で私のPCには登録がされているせいか、私のPCではvbsの実行はうまくいきます。
何卒返答をお願いいたします。
大変お待たせいたしました。C#やその他.NETの場合、マニフェストの記述内容を少々異なったものにする必要があります。そちらにつきましては、こちらの記事の内容を参考に試してみていただければと思います:.NETでのRegFree-COM
http://dev.activebasic.com/egtra/2014/10/06/685/
ご返答ありがとうございます。
試してみます。
[…] http://dev.activebasic.com/egtra/2012/07/07/498/ […]