首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

,通过Invoke执行fireEvent函数报错!多谢

2012-12-15 
求助,通过Invoke执行fireEvent函数报错!!谢谢当前,我使用VC6进行OLE开发。现在遇到一个问题,下拉框需要触发

求助,通过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是指什么?

热点排行