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