求助,通过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;}
[其他解释]
fishion : 您的spDoc4->createEventObject( &name, &eventObj); 中 spDoc4是指什么?