我正在尝试为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对象查看器的屏幕截图:
答案 0 :(得分:1)
OleView屏幕截图中的ISAPTran::Connect
签名似乎是正确的。另一个,VARIANT_BOOL Connect([in] BSTR sap_string)
只是一个匹配的dispinterface
定义,它是一个用于通过ISAPTran
(late 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)
),它是否会被触及?