Vba ATL创建的COM接口继承IDispatch,但后期绑定不起作用

Vba ATL创建的COM接口继承IDispatch,但后期绑定不起作用,vba,vbscript,com,atl,idispatch,Vba,Vbscript,Com,Atl,Idispatch,这是我的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)

这是我的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;
    };
};
这是CFrame类声明,它应该实现IFrame:

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)
class ATL\u NO\u VTABLE CFrame:
公共CComObjectRootEx,
公共课程,
公共场所
{
公众:
CFrame()
{
}
声明\u注册表\u资源ID(IDR\u帧)
开始COM映射(CFrame)
COM_接口_条目(IFrame)
COM_接口_条目(IDispatch)
END_COM_MAP()
声明\u保护\u最终\u构造()
HRESULT FinalConstruct()
{
返回S_OK;
}
void FinalRelease()
{
}
};
对象输入自动(uuuIdof(Frame),CFrame)
COM服务器得到注册,当我在VBA中使用Frame对象时,它可以正常工作,但需要提前绑定。我想将此对象与VBScript一起使用,因此我确实需要后期绑定

但后期绑定无法完成。我了解了情况,似乎ATL(和IDispatchImp类)完成了IDispatch所需的所有实现,这使我能够将对象与自动化工具(例如VBScript)一起使用

但是,在实践中,脚本给出了“无法创建活动X控件”错误。在VBA中,我尝试早期绑定时也是如此


我做错了什么?我在Windows 7 64位上使用Visual Studio 2012,但我的COM服务器是32位的(并且已在系统中注册)。

基本上这也适用于VBScript。但是,您的脚本主机应该具有匹配位。如果您正在使用
cscript
,请确保为您的32位COM服务器启动32位版本
C:\Windows\SYSWOW64\cscript.exe
。@romar。我认为这不是问题。VBA使用32位主机,但仍然后期绑定不起作用。错误出在COM服务器上,我想不是客户端。代码不完整,您发布的片段几乎没有任何错误(前提是服务器有正确的注册,包括类型库)。但是,有些主机可能希望您实现某些附加接口,例如,
iprovideoclassinfo
。您的即时调试策略是在构造函数中放置一个断点,以查看您的类是否被实例化。然后,如果是,您将看到在故障发生之前查询了哪些接口。如果未访问构造函数,则存在注册问题。在.idl中声明的typelib版本是什么?@sharptooth不是版本(1.0)吗?