将 COM 类转换为 C#C++以便由可执行文件C++调用
Convert C++ COM class to C# for invocation by C++ executable
抱歉,但这是来自 C# 人员的与 C# C++集成的问题!
我有一个C++ EXE,它从注册为具有特定类 ID 的 InProcServer32 的 COM DLL 调用方法。
EXE 的调用方式如下:
EXENAME --UseClassId {CLSID}
COM DLL 目前是C++内置的,核心".h"文件如下所示:
class DECLSPEC_UUID("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX1}") ImplementationClass : public ComClass<IInterfaceMain>
{
public:
IFACEMETHODIMP Method1(IInterfaceSub1 **param1) _NOEXCEPT override { return 1; }
IFACEMETHODIMP Method2(IInterfaceSub1** param2) _NOEXCEPT override { return 1; }
};
CoCreatableClass(ImplementationClass)
}}}
它使用的接口定义如下:
MIDL_INTERFACE("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX2")
IInterfaceMain : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE Method1(IInterfaceSub1 **param1) = 0;
virtual HRESULT STDMETHODCALLTYPE Method2(IInterfaceSub2 **param2) = 0;
};
。上面使用的接口也以类似的方式定义。
现在,我想在.Net中创建这个COM DLL。 所以代码目前看起来像这样:
[ComVisible(true), Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX1"), ClassInterface(ClassInterfaceType.None)]
public class ImplementationClass : IInterfaceMain
{
public ImplementationClass() {}
public int Method1(IInterfaceSub1 param1) { return 1; }
public int Method2(IInterfaceSub2 param2) { return 1; }
}
我也用 C# 创建了主界面,如下所示(但没有任何MIDL_INTERFACE/Guid):
public interface IInterfaceMain
{
int Method1(IInterfaceSub1 param1);
int Method2(IInterfaceSub2 param2);
}
调用主 EXE(其代码不可用)会根据构建体系结构返回这两个错误(顶部是"x64",底部是"任何 CPU")。
0x80004002 No such interface supported
0x800401f9 Error in the DLL.
正如我所说,我不流利C++但在我看来,这应该有效。
由
Hans Passant提供,答案是使用正确的[ComVisible],[Guid]和[InterfaceType]属性装饰接口。
相关文章:
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 编译的C可执行文件被Windows defender检测为病毒
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何在可执行文件中存储常量数组?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 可执行文件C++包括.obj,.lib和.dll吗?
- 无法在 Linux 上运行C++ ZMQ 项目的可执行文件
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"