C++ 将非托管(MFC)COM服务器替换为.NET COM服务器,用于非托管COM客户端(MFC)

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

我有一个MFC COM服务器(ActiveX)和一个MFC COM客户端。服务器是通过以下IDL构建的:

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服务器
这就是C代码:

现在我的问题是

所有构建都很好,当COM客户端调用服务器中的函数时,该函数被执行。这意味着要创建和调用COM服务器的COM相关内容正在工作。 调用上的客户端HRESULT为0x80020005(显示类型不匹配)。
当我将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
        }
  }
}