C++ 将非托管(MFC)COM服务器替换为.NET COM服务器,用于非托管COM客户端(MFC)
我有一个MFC COM服务器(ActiveX)和一个MFC COM客户端。服务器是通过以下IDL构建的:C++ 将非托管(MFC)COM服务器替换为.NET COM服务器,用于非托管COM客户端(MFC),c++,.net,mfc,com,C++,.net,Mfc,Com,我有一个MFC COM服务器(ActiveX)和一个MFC COM客户端。服务器是通过以下IDL构建的: library SomeLib { importlib(STDOLE_TLB); [ uuid(some-guid), dispinterface ISomeIntf { methods: [id(1)] HRESULT Foo( ); } [ uuid(some-guid), coc
library SomeLib
{
importlib(STDOLE_TLB);
[ uuid(some-guid),
dispinterface ISomeIntf
{
methods:
[id(1)] HRESULT Foo( );
}
[ uuid(some-guid),
coclass SomeClass
{
[default] dispinterface ISomeIntf;
};
}
客户端通过IDL(MIDL创建的tlb)中TypeLibrary的#import指令生成的包装器使用Invoke调用COM服务器中的函数
我开始在.NET中替换COM服务器。这就是我所做的:
- 使用tblimp.exe创建描述接口的程序集
- 创建了一个C#类库OM visible,并添加了对从IDL创建的程序集的引用
- 实现了从程序集中定义的接口派生的COM可见类
- 生成并注册.NET COM服务器
当我将IDL更改为不返回HRESULT时,重建客户端和服务器都可以正常工作。当我不使用由tlbimp创建的程序集并定义自己的接口(与IDL中的签名相同)时,它也可以工作。 根据MS文档,HRESULT被转换为void,服务器中的故障通过抛出异常报告,异常被封送到HRESULT。但事实似乎并非如此,不知何故 我错了什么,我不明白什么
谢谢。作为私有方法
Foo
可以吗?@jac COM只关心v表中的索引。访问修饰符未在接口处公开。@杰克,你说得对。该代码只是一些伪代码,以了解其中的内容。Foo
作为私有方法可以吗?@jac COM只关心v表中的索引。访问修饰符未在接口处公开。@杰克,你说得对。该代码只是一些伪代码,以了解其中的一个。
using System;
using System.Runtime.InteropServices;
namespace SomeLibNS
{
[ClassInterface(ClassInterfaceType.None), Guid("some-guid"), ProgId("SomeLibNS.SomeLib.1")]
[ComVisible(true)]
public partial class SomeLibCtrl : SomeLib
{
void Foo ()
{
// Do something right here
}
}
}