在C ++中实现COM接口,方法没有公开

时间:2016-08-14 18:46:08

标签: c++ com

我正在编写一个在C ++中实现第三方接口的插件。我在MSVS中创建了一个ATL项目,添加了一个ATL简单对象,然后使用了"实现接口"该课程的快捷方式。所有的接口方法都被存根并构建。我还补充道:

[assembly:System::Runtime::InteropServices::ComVisible(true)];

并在构建之后运行(成功):

regsvr32.exe VWorksCPPATL.dll
regasm /codebase /tlb VWorksCPPATL.dll

然而,当我在oleview中打开DLL时,我没有看到任何接口的方法被暴露(除了IUnknown)并且DLL没有被加载插件的容器。

当我打开一个用C#编写的工作DLL时,我看到了我已实现的接口以及它们在coclass下列出的方法。 (我已经设置了"注册COM interop"以及"使程序集COM-visible"属性在项目中。)

当我打开供应商(插件容器的创建者)用C ++编写的工作DLL时,我在一些但不是全部的DLL中看到了暴露的方法/接口。

我是否需要手动修改我的IDL文件以公开这些方法?现在它显示(省略属性):

interface IPF400 : IDispatch{}
library VWorksCPPATLIB{
    coclass PF400{
        [default] interface IPF400;
    }
}

......或者我可能因其他原因而遇到麻烦?

1 个答案:

答案 0 :(得分:1)

好吧,我必须按照this answer中的说明从包含我正在实现的接口的DLL导出TLB,然后将importlib("....tlb")interface IFooInterface添加到IDL手动文件(省略属性):

interface IPF400 : IDispatch{
};

library VWorksCPPATLLib
{
    importlib("stdole2.tlb");
    importlib("IWorksDriver.tlb"); // <-- Added

    coclass PF400
    {
        interface IControllerClient; // <-- Added
        [default] interface IPF400;
    };

};