COleDispatchDriver错误:自动返回值强制失败,DISP_E_TYPEMISMATCH($ 80020005)

时间:2013-12-06 10:53:35

标签: c# c++ visual-studio com mfc

我正在尝试为C#Interop COM服务器使用自动生成的MFC包装类。包装类是使用Add-> Class->“MFC Class From TypeLib”生成的,它继承了COleDispatchDriver

尝试使用包装器类的Connect()方法失败并出现DISP_E_TYPEMISMATCH OLE异常,因为COM服务器返回VT_BOOL,而我的包装器类需要VT_VARIANT(I步入MFC来源检查)。这是失败的代码:

CSAPTran0 comObj;
comObj.CreateDispatch(__uuidof(SAPTran));
comObj.Connect(L"something");

另一方面,使用此代码可以正常工作:

ISAPTran * comIntf = 0;
HRESULT hr = CoCreateInstance(__uuidof(SAPTran),NULL, 
    CLSCTX_INPROC_SERVER,__uuidof(ISAPTran),(void**)&comIntf);
comIntf->Connect(SysAllocString(L"something"));

更新

这是自动生成的包装器Connect()函数的代码:

BOOL Connect(LPCTSTR sap_string)
{
    BOOL result;
    static BYTE parms[] = VTS_BSTR ;
    InvokeHelper(0x60020005, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, sap_string);
    return result;
}

这是来自OLE / COM对象查看器的屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

OleView屏幕截图中的ISAPTran::Connect签名似乎是正确的。另一个,VARIANT_BOOL Connect([in] BSTR sap_string)只是一个匹配的dispinterface定义,它是一个用于通过ISAPTranlate binding)调用双IDispatch的typeinfo。

这就是MFC生成的包装器CSAPTran0::Connect试图调用它的方式:通过IDispatch::Invoke而不是直接调用它。 您能告诉我们包装器生成的代码吗?是否为您传入的字符串文字(BSTR)内部(SysAllocString)创建了comObj.Connect(L"something")

[已编辑] COleDispatchDriver::InvokeHelperV内放置一个断点,在此行:

SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,
        &dispparams, pvarResult, &excepInfo, &nArgErr);

m_lpDispatch->Invoke返回时,sc == DISP_E_TYPEMISMATCH是否为真?

除此之外,如果你在C#方法实现的开头放置一个断点(或Debug.Assert(false)),它是否会被触及?