【问题标题】:InvalidCastException when calling COM method from C# client从 C# 客户端调用 COM 方法时出现 InvalidCastException
【发布时间】:2014-04-17 15:11:42
【问题描述】:

我是 COM 世界的新手,需要您的帮助。

在 C# 客户端中使用此 dll 时,我从 COM dll 中获得 InvalidCastException,该 dll 在 C++ 中实现。

以下是我正在尝试的场景。

IDL:

[
    uuid(7DE8F308-32D8-4793-A1B1-311AB2EACABB),
    version(1.0),
]
library TestLib
{
    importlib("stdole2.tlb");

    [
        object,
        uuid(3AEA031A-458D-4329-9062-C210FABD5EF6),
        dual,
        nonextensible,
        pointer_default(unique)
    ]
    interface IParent : IDispatch{
    };
    [
        object,
        uuid(7C809C51-CBAF-452C-825B-617365EB11C0),
        dual,
        nonextensible,
        pointer_default(unique)
    ]
    interface IChild : IParent{
    };
    [
        object,
        uuid(D5800994-9538-481E-8EE7-F4441542A091),
        dual,
        nonextensible,
        pointer_default(unique)
    ]
    interface IMain : IDispatch{
        [id(1)] HRESULT GetObject([out,retval] IParent** pVal);
    };



    [
        uuid(07068857-6AD3-4FEF-A83B-DA4B876FFD70)      
    ]
    coclass Parent
    {
        [default] interface IParent;
    };
    [
        uuid(FC490ABD-E446-4426-B0BE-BF3D8144AA8C)      
    ]
    coclass Child
    {
        [default] interface IChild;
    };
    [
        uuid(449731C4-9384-41F3-B954-813AD8FAFB08)      
    ]
    coclass Main
    {
        [default] interface IMain;
    };
};

以下是我在 C# 客户端中调用的方法实现:

 STDMETHODIMP CMain::GetObject(IParent** pVal)
 {
      IChild* child;
      CoCreatInstance(CLSID_Child, NULL, CLSCTX_INPROC_SERVER, IID_IChild, (void**)&child);

      *pVal = child;

      return S_OK;
  }

当我在将控制权返回给 C# 客户端时执行“return S_OK”后尝试调试时,我正面临 InvalidCastExcetion。

C# 客户端:

 IMain main = new Main();
 IParent parent = main.GetObject();

我没有得到真正的问题是什么!!??

其他细节: 使用 Windows 7 64 位、Visual Studio 2010 实现 COM 和 C# 客户端。 COM 实现是用 C++ 实现的。

【问题讨论】:

    标签: c# visual-studio-2010 com


    【解决方案1】:

    尝试用下一种方式实现:

    STDMETHODIMP CMain::GetObject(IParent** pVal)
    {
          IParent* parent;
          HRESULT hr = CoCreatInstance(CLSID_Child, NULL, CLSCTX_INPROC_SERVER, IID_IParent, (void**)&parent);
    
          *pVal = parent;
    
          return hr;
    }
    

    然后检查 hr 是否为 S_OK。

    您可能没有在子类 (CLSID_Child) 实现中为 IID_IParent 实现 QueryInterface。

    如果您使用的是 ATL,它将如下所示:

    BEGIN_COM_MAP(CChild)
       COM_INTERFACE_ENTRY(IChild)
       COM_INTERFACE_ENTRY(IParent)
       COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()
    

    【讨论】:

    • 您好。谢谢你的回复。我的代码中缺少 COM_INTERFACE_ENTRY(IParent)。现在它工作正常。
    猜你喜欢
    • 2017-12-19
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多