DISPID dispid;
LPOLESTR lpOleStr=L"Count";
HRESULT hr=pDispatch->GetIDsOfNames(IID_NULL,&lpOleStr,1,LOCALE_SYSTEM_DEFAULT,&dispid); //成功了
if(FAILED(hr))
{
AfxMessageBox("GetIDsOfNames Call failed");
return;
}
COleVariant VarResult;
DISPPARAMS dispparams;
memset(&dispparams,0,sizeof(DISPPARAMS));
dispparams.cArgs=0;
hr=pDispatch->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET, &dispparams,&VarResult,0,NULL);//这里为什么不成功?

解决方案 »

  1.   

    GetIDsOfNames已经成功了
    但Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET,&dispparams,&VarResult,0,NULL);
    返回错误DISP_E_MEMBERNOTFOUND
    该错误MSDN上意思是The requested member does not exist, or the call to Invoke tried to set the value of a read-only property.这不是很矛盾吗,dispid都取得了,说明成员存在,但为什么取属性的时候又说不存在呢??
      

  2.   

    dispparams究竟该怎么设置,我取属性值,没有参数可设置啊。我这样写:
    DISPPARAMS dispparams;
    memset(&dispparams,0,sizeof(DISPPARAMS));
    VARIANTARG *pArg1=new VARIANTARG;
    memset(pArg1,0,sizeof(VARIANTARG));
    dispparams.rgvarg=pArg1;
    dispparams.rgvarg[0].vt=VT_BSTR;
    dispparams.rgvarg[0].bstrVal=T2OLE(_T("Count"));
    dispparams.cArgs=1;
    dispparams.cNamedArgs=0; 
    dispparams.rgdispidNamedArgs=&dispid; //dispid已经取得我试了,也一样不行。
      

  3.   

    DISP_E_MEMBERNOTFOUND错误
    的文字提示是: 停用了"调用取消"啥意思?
      

  4.   

    这是调用Collection的例子
      bstrMethodName = L"_NewEnum";
      hr = pCollection->GetIDsOfNames(IID_NULL, & bstrMethodName, 1, LOCALE_USER_DEFAULT, &dispid);
      if( FAILED(hr))
      {
        bstrMethodName = L"NewEnum";
        hr = pCollection->GetIDsOfNames(IID_NULL, & bstrMethodName, 1, LOCALE_USER_DEFAULT, &dispid);
        if(FAILED(hr)) _com_issue_errorex(hr, pCollection.p, IID_IDispatch);
      }  variantarg.Clear();
      memset(&excepinfo, 0, sizeof(EXCEPINFO));
      uArgErr = 0;   if((SUCCEEDED( hr = pCollection->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, 
    &variantarg, &excepinfo, &uArgErr))) || (SUCCEEDED( hr = pCollection->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, 
    &variantarg, &excepinfo, &uArgErr))))
      {
         if( variantarg.vt != VT_UNKNOWN ) variantarg.ChangeType(VT_UNKNOWN);
         spEnumVariant = variantarg.punkVal;
      }