IEからActiveXObjectで生成できるCOMをつくる

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できます。