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

时间:2014-07-08 13:42:12

标签: 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),
    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)

COM服务器已注册,当我在VBA中使用Frame对象但通过早期绑定时,它工作正常。我想在VBScript中使用这个对象,所以我确实需要后期绑定。

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

然而,在实践中,脚本提供了#34;无法创建Active X控件&#34;错误。当我尝试早期绑定时,它在VBA中是一样的。

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

0 个答案:

没有答案