2014-04-17 51 views
0

我是COM世界的新手,需要您的帮助。从C#客户端调用COM方法时发生InvalidCastException

我得到COM DLL中的InvalidCastException,它是在C#客户端中使用此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; 
    } 

当我尝试的 “返回S_OK”,同时将控制权返回到C#的客户端执行后的调试我面临着InvalidCastExcetion。

C#客户:

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

我没有得到什么实际的问题!! ??

其他详细信息: 使用Windows 7 64位,Visual Studio 2010用于COM实现和C#客户端。 COM实现使用C++。

回答

0

尝试实施它在未来的方式:

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。

可能你没有在Child类(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() 
+0

喜塔斯。谢谢你的回复。我的代码中缺少COM_INTERFACE_ENTRY(IParent)。现在它工作正常。 – Eddie

相关问题