我正在编写一个用 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/