ActiveXの証明書の問題に打ちのめされWalkmanの再生履歴をアップするWebアプリの開発を放置して数ヶ月。ActiveXをあきらめて、普通のCOMを使いPackageForTheWebか何かでインストールさせようという方向に転換。ActiveXのプロジェクトを普通のCOMに書き直しました。と、自分で書いていて普通のCOMってなんぞや?と思ったので、単にVisualStudioのATLプロジェクト作成したdllと解釈していただきたく。
さて、書き直したといってもi/f部分を変えただけで中身のクラスライブラリはそのままコピーしたので大した手間はありません。
IEでActiveXオブジェクトを生成する場合、JavaScriptに”ActiveXObject”というfunctionが用意されており
var itunes = new ActiveXObject("iTunes.Application");
とかすると、iTunesWindowsCOMが呼び出せたりします。
Visutal Studio 2005で普通にALTライブラリを作成したら、IDispatchを継承したinterfaceを作ってくれました。あとはstdafx.hあたりで
#include <atlctl.h>
をして、クラスの方で
class ATL_NO_VTABLE CSwMediaDeviceManager : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CSwMediaDeviceManager, &CLSID_SwMediaDeviceManager>, public IDispatchImpl<ISwMediaDeviceManager, &IID_ISwMediaDeviceManager, &LIBID_SongWolfLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, public IObjectSafetyImpl<CSwMediaDeviceManager, INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA> { public: CSwMediaDeviceManager(){} DECLARE_REGISTRY_RESOURCEID(IDR_SWMEDIADEVICEMANAGER) BEGIN_COM_MAP(CSwMediaDeviceManager) COM_INTERFACE_ENTRY(ISwMediaDeviceManager) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IObjectSafety) END_COM_MAP()
として、
IObjectSafetyImplを継承して、IObjectSafetyのエントリを追加すれば、*.rgsで登録しているVersionIndependentProgIDの文字列でnew ActiveXObjectできます。