RemoteCall是我写的一个调用自动化组件的方法。
我写了一个测试组件。有4个方法:
STDMETHOD(hello4)(BSTR hello);
STDMETHOD(hello3)(int i);
STDMETHOD(hello2)();
STDMETHOD(hello1)(BSTR first,BSTR second);
结果STDMETHOD(hello3)(int i);
STDMETHOD(hello2)();都能正确执行。
但是STDMETHOD(hello4)(BSTR hello)出问题,
该方法只是简单的:::MessageBox(NULL,OLE2A(hello),"hbf", MB_OK);
结果应该打出hello值,但奇怪的是打出“addref”而STDMETHOD(hello1)(BSTR first,BSTR second);报”变量类型不正确“
我观察了一下,getIDSofName会把参数值改成“addref",对hello4来说
参数改变不影响执行,只是结果错了。而对hello1,只传入一个实参,报错!!
为什么会这样??template<class T>
void RemoteCall(REFCLSID CLSID, BSTR MethodName,vector<T> params )
{
HRESULT hr;
IUnknown *pU;
IDispatch *pD;
DISPID DispIds[1];
int cArgs=params.size();
VARIANTARG *rgvarg=NULL;//new VARIANTARG[cArgs];
try{
if(cArgs)
{
vector <T>::reverse_iterator it;
vector <T> vtemp;
for(it=params.rbegin();it!=params.rend();it++)
vtemp.push_back(*it);
rgvarg=new VARIANTARG[cArgs];
for(int i=0;i<cArgs;i++)
{
CComVariant param(vtemp.at(i));
rgvarg[i]=param;
}
}
DISPPARAMS dpParms = { rgvarg, NULL, cArgs, 0};
hr=CoCreateInstance(CLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pU);
TESTHR(hr);
hr=pU->QueryInterface( __uuidof(IDispatch), (void**)&pD );
TESTHR(hr);
hr = pD->GetIDsOfNames(
IID_NULL,
&MethodName,
1,
LOCALE_SYSTEM_DEFAULT,
DispIds
);
TESTHR(hr);
hr = pD->Invoke(
DispIds[0],
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&dpParms,
NULL,
NULL,
NULL);
_com_raise_error(hr);
TESTHR(hr);
}catch(_com_error e)
{
MessageBox(NULL, e.ErrorMessage(), _T("Error"), MB_OK);
}
catch(...)
{
MessageBox(NULL, "error fuck", _T("Error"), MB_OK);
}
pU->Release();
pD->Release();
}
我写了一个测试组件。有4个方法:
STDMETHOD(hello4)(BSTR hello);
STDMETHOD(hello3)(int i);
STDMETHOD(hello2)();
STDMETHOD(hello1)(BSTR first,BSTR second);
结果STDMETHOD(hello3)(int i);
STDMETHOD(hello2)();都能正确执行。
但是STDMETHOD(hello4)(BSTR hello)出问题,
该方法只是简单的:::MessageBox(NULL,OLE2A(hello),"hbf", MB_OK);
结果应该打出hello值,但奇怪的是打出“addref”而STDMETHOD(hello1)(BSTR first,BSTR second);报”变量类型不正确“
我观察了一下,getIDSofName会把参数值改成“addref",对hello4来说
参数改变不影响执行,只是结果错了。而对hello1,只传入一个实参,报错!!
为什么会这样??template<class T>
void RemoteCall(REFCLSID CLSID, BSTR MethodName,vector<T> params )
{
HRESULT hr;
IUnknown *pU;
IDispatch *pD;
DISPID DispIds[1];
int cArgs=params.size();
VARIANTARG *rgvarg=NULL;//new VARIANTARG[cArgs];
try{
if(cArgs)
{
vector <T>::reverse_iterator it;
vector <T> vtemp;
for(it=params.rbegin();it!=params.rend();it++)
vtemp.push_back(*it);
rgvarg=new VARIANTARG[cArgs];
for(int i=0;i<cArgs;i++)
{
CComVariant param(vtemp.at(i));
rgvarg[i]=param;
}
}
DISPPARAMS dpParms = { rgvarg, NULL, cArgs, 0};
hr=CoCreateInstance(CLSID,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pU);
TESTHR(hr);
hr=pU->QueryInterface( __uuidof(IDispatch), (void**)&pD );
TESTHR(hr);
hr = pD->GetIDsOfNames(
IID_NULL,
&MethodName,
1,
LOCALE_SYSTEM_DEFAULT,
DispIds
);
TESTHR(hr);
hr = pD->Invoke(
DispIds[0],
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&dpParms,
NULL,
NULL,
NULL);
_com_raise_error(hr);
TESTHR(hr);
}catch(_com_error e)
{
MessageBox(NULL, e.ErrorMessage(), _T("Error"), MB_OK);
}
catch(...)
{
MessageBox(NULL, "error fuck", _T("Error"), MB_OK);
}
pU->Release();
pD->Release();
}
if(cArgs)
{
vector <T>::reverse_iterator it;
vector <T> vtemp;
for(it=params.rbegin();it!=params.rend();it++)
vtemp.push_back(*it);
rgvarg=new VARIANTARG[cArgs];
for(int i=0;i<cArgs;i++)
{
CComVariant param(vtemp.at(i));
rgvarg[i]=param;
}
}
DISPPARAMS dpParms = { rgvarg, NULL, cArgs, 0};
替换成这样就可以了:
CComVariant* rgvarg = NULL;
if(cArgs)
{
rgvarg = new CComVariant[cArgs];
for(int i = 0; i < cArgs; ++i)
rgvarg[i] = params[cArgs - 1 - i];
} DISPPARAMS dpParms = {(VARIANTARG*)rgvarg, NULL, cArgs, 0};
多参数的STDMETHOD(hello1)(BSTR first,BSTR second)有异常,而且
catch(_com_error e)
{
MessageBox(NULL, e.ErrorMessage(), _T("Error"), MB_OK);
}
捕捉不到。
谢谢,非常感谢,调了几天了,不知错在哪里。
catch(_com_error e)
{
MessageBox(NULL, e.ErrorMessage(), _T("Error"), MB_OK);
}
捕捉不到。-GX 编译选项中 打开没有
如果是 _com_error,如输入的参数个数不对,那么可以捕捉到,提示“无效的参数个数”。
真的很麻烦,各位救急啊!!