这是我的 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 位的(并且已在系统中注册)。