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

Implementing a COM interface in C++, methods not being exposed

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

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

并在构建后获得这些 运行(成功):

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

但是,当我在 oleview 中打开 DLL 时,我没有看到任何公开的接口方法(IUnknown 除外)并且 DLL 没有被插件的容器加载。

当我打开一个用 C# 编写的工作 DLL 时,我看到我已经实现的接口及其方法列在 coclass 下。 (我已经在项目上设置了 "register for COM interop" 和 "make assembly COM-visible" 属性。)

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

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

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

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

好吧,我必须按照 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;
    };

};