これは私の IDL ファイルです。IFrame はデュアル インターフェイスであり、IDispatch と IUnknown の両方を継承します。
[
object,
uuid(C5AD0517-37FC-479C-9C7A-A063B17E4A2E),
dual,
nonextensible,
pointer_default(unique)
]
interface IFrame : IDispatch{
};
[
uuid(F7D50952-4AF1-491B-B0AA-35083AEFA998),
version(1.0),
]
library bdsCOMLib
{
importlib("stdole2.tlb");
[
uuid(9C2E7E2D-A39C-4FE7-BEEB-3BF65F9D4C05)
]
coclass Frame
{
[default] interface IFrame;
};
};
そして、これは IFrame を実装すると想定される CFrame クラスの宣言です。
class ATL_NO_VTABLE CFrame :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CFrame, &CLSID_Frame>,
public IDispatchImpl<IFrame, &IID_IFrame, &LIBID_bdsCOMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CFrame()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_FRAME)
BEGIN_COM_MAP(CFrame)
COM_INTERFACE_ENTRY(IFrame)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
};
OBJECT_ENTRY_AUTO(__uuidof(Frame), CFrame)
COM サーバーが登録され、VBA で Frame オブジェクトを使用すると正常に動作しますが、早期バインディングによって動作します。このオブジェクトを VBScript で使用したいので、レイト バインディングが必要です。
ただし、遅延バインディングは実行できません。状況を調べたところ、ATL (および IDispatchImp クラス) が IDispatch に必要なすべての実装を行っているようです。これにより、オートメーション ツール (VBScript など) でオブジェクトを使用できるようになります。
ただし、実際には、スクリプトは「Active X コントロールを作成できません」というエラーを出します。アーリー バインディングを試してみると、VBA でも同じです。
私は何を間違っていますか?Windows 7 64 ビットで Visual Studio 2012 を使用していますが、COM サーバーは 32 ビットです (システムに登録されています)。