出于某种原因,我必须在我的代码中使用COM控件。我想调用COM控件导出的方法。
idl文件:
methods:
[id(1)] boolean Open(BSTR filepath, BSTR rootname);
cpp文件:
VARIANT pVarResult;
EXCEPTINFO pExcepInfo;
unsigned int puArgErr;
DISPPARAMS pParams;
memset(&pParams, 0, sizeof(DISPPARAMS));
VARIANTARG param[2];
param[0].vt = VT_BSTR;
param[0].bstrVar = filepath.AllocSysString();
param[1].vt = VT_BSTR;
param[1].bstrVar = rootname.AllocSysString();
pParams.rgvars = param;
pParams.cArgs = 2;
hResult = pDispatch->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &pParams, &pVarResult, &pExcepInfo, &puArgErr);
我收到错误说“参数数量无效”。我的代码错在哪里? 如何将两个字符串参数传递给com控件中定义的接口?这似乎不可能。
编辑1:添加更多返回信息。这似乎毫无用处。
pVarResult = NULL;
pExcepInfo.wcode = 52424;
puArgErr = 1;
答案 0 :(得分:1)
[id(1)] boolean Open(BSTR filepath, BSTR rootname);
您无法使用IDispatch调用此函数,它没有正确的签名。它只能在函数的返回类型为HRESULT时才能工作。正确的声明如下:
[id(1)] HRESULT Open(BSTR filepath, BSTR rootname, [out, retval]VARIANT_BOOL* retval);
COM函数通常对返回HRESULT有非常强烈的要求,它还需要正确地整理公寓边界的调用。这是唯一可以返回失败错误代码的方法。
答案 1 :(得分:0)
VARIANT pVarResult;
EXCEPINFO pExceptInfo;
UINT pArgErr;
hResult = pDispatch->Invoke(id, IID_NULL,
LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD, &pParams, &pVarResult, &pExceptInfo, &pArgErr);
尝试提供其他参数
答案 2 :(得分:0)
谢谢大家的时间。
导致这个问题是我的愚蠢错误。因为我使用MFC库来实现COM控件。在MFC框架中,如果要导出接口,则必须使用宏来声明它。像这样。
DISP_FUNCTION(MyCtrl, "Open", Open, VT_BOOL, VTS_BSTR VTS_BSTR)
我写的是:
DISP_FUNCTION(MyCtrl, "Open", Open, VT_BOOL, VTS_BSTR, VTS_BSTR)
不应在两个VTS_BSTR之间添加逗号。