读书人

通过Invoke执行fireEvent函数报错!

发布时间: 2012-12-15 15:16:03 作者: rapoo

求助,通过Invoke执行fireEvent函数报错!!谢谢
当前,我使用VC6进行OLE开发。现在遇到一个问题,下拉框需要触发onchange动作。使用 fireEvent 函数执行。目前VC6的SDK的版本过低,无法IHTMLElement3中的方法fireEvent方法。故希望使用invoke调用(自动测试工具watri是可以执行的)。

以下是我写的代码如下:


//注: p为 一个IHTMLElement *p ,作为参数传递进来
IDispatch *pIDispatch;
hr = p->QueryInterface(IID_IDispatch, (void**)&pIDispatch);
if(FAILED(hr) ) {printf(" 获取 IDispatch 失败\n"); return 1;}

UINT Count = 0;
pIDispatch->GetTypeInfoCount(&Count);
if(Count==0){
printf("InternetExplorer.Application Object has not TypeInfo\n");
return 0;
}
//获取属性ID
DISPID FunctionID;
BSTR PropName;
PropName=SysAllocString(L"fireEvent");
hr=pIDispatch->GetIDsOfNames(IID_NULL,&PropName,1,LOCALE_SYSTEM_DEFAULT,&FunctionID);
SysFreeString(PropName);
if(FAILED(hr) ) {printf(" 获取fireEvent失败\n"); return 1;}
cout<<"wan="<<hr<<" id="<<FunctionID<<endl;

//////invoke
DISPPARAMS dispParams;
VARIANTARG _vParams[3];
VARIANTARG vaResult;
EXCEPINFO exInfo;
UINT argErr;

VariantInit( &vaResult );
memset(&exInfo, 0, sizeof(EXCEPINFO));

//////参数
VARIANT Caceled;
VARIANT eventName;
VARIANT eventPtc;
VariantInit( &Caceled );
VariantInit( &eventName );
VariantInit( &eventPtc );

dispParams.cArgs = 3;
dispParams.cNamedArgs = 0;
dispParams.rgdispidNamedArgs = NULL;

//////设置值
_vParams[0].vt = VT_BSTR;
_vParams[0].bstrVal = L"onchange";
_vParams[1] = eventPtc;
_vParams[2] = Caceled;

dispParams.rgvarg = _vParams; ///异常

hr = pIDispatch->Invoke(FunctionID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams,&vaResult, &exInfo, &argErr);
if(FAILED(hr) ) {printf(" 执行函数失败[%d]\n",hr); return 1;}



目前这个函数编译通过,执行时在最后一步报错,错误代码为 -2147352567。 请问
1, 能否通过Invoke执行fireEvent?
2, 帮忙看看代码哪里有问题,为啥执行不成功?谢谢
[最优解释]
VARIANT name;
VariantInit(&name);
CComPtr<IHTMLEventObj> eventObj = NULL;
spDoc4->createEventObject( &name, &eventObj);
CComVariant vObj(eventObj);

vParams[0].vt = VT_BSTR;
_vParams[0].bstrVal = L"onchange";
_vParams[1] = vObj;
_vParams[2] = Caceled;

参考下


[其他解释]
1.我觉得这个event是用来执行回调函数的吧?既然这样,应该用IConnectionPointcontainer接口,IConnectionPoint::Advise回调机制,然后在响应时对这个 onchange做处理


[其他解释]
fishion : 您的spDoc4->createEventObject( &name, &eventObj); 中 spDoc4是指什么?

读书人网 >VC/MFC

热点推荐