c++ - 在 C++ 中实现 COM 接口(interface),不公开方法

标签 c++ com

我正在编写一个用 C++ 实现第 3 方接口(interface)的插件。我在 MSVS 中创建了一个 ATL 项目,添加了一个 ATL 简单对象,然后在该类上使用了“实现接口(interface)”快捷方式。所有接口(interface)方法都被 stub 并构建。我还补充说:

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

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

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

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

当我打开一个用 C# 编写的工作 DLL 时,我看到我已经实现的接口(interface)及其方法列在组件类下。 (我已经在项目上设置了“注册 COM 互操作”和“使程序集 COM 可见”属性。)

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

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

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

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

最佳答案

好吧,我必须按照 this answer 中的说明进行操作从包含我正在实现的接口(interface)的 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;
    };

};

关于c++ - 在 C++ 中实现 COM 接口(interface),不公开方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945481/

相关文章:

python - 如何从 dlib 中的 5 个面部标志估计面部姿势?

c++ - 访问 std::string 中字符串的位置大于其大小的元素

c# - 更改框架 4.0 中数组的 Com Interop 表示?

com - 有没有办法判断两个 COM 接口(interface)引用是否指向同一个实例?

windows - 为什么 Windows Search 会在我的 IFilter 中查询一堆奇怪的界面?

c++ - 哪个是 IErrorInfo 版本的正确处理

c++ - 在两个语句中创建引用变量

c++ - Hadoop Pipes 找不到共享库

c++ - 将 vector 作为参数传递时没有匹配的函数异常(C++)

c# - 如何在 C# 中转换 IDispatch