我想使用ITypeInfo接口来获取某个函数的参数信息,但GetFuncDesc方法的第一个参数是函数的Index而非DispID,有没有一种方法可以直接用 DispID 或者可以把 DispID 转换到 Index?ITypeInfo2 接口有个GetFuncIndexOfMemId方法,但我试了很多次都不成功。多谢。

解决方案 »

  1.   


    HRESULT hr = S_OK;
    FUNCDESC* pFuncDesc = NULL;
    TYPEATTR* pAttr;
    hr = pTypeInfo->GetTypeAttr(&pAttr);
    if (FAILED(hr))
    return hr;
    int i;
    for (i=0;i<pAttr->cFuncs;i++)
    {
    hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
    if (FAILED(hr))
    return hr;
    if (pFuncDesc->memid == dispidMember)
    break;
    pTypeInfo->ReleaseFuncDesc(pFuncDesc);
    pFuncDesc = NULL;
    }
    pTypeInfo->ReleaseTypeAttr(pAttr); if (pFuncDesc != NULL)
    {
      // do something
    }
      

  2.   

    重新整理一下:HRESULT hr = S_OK; 
    FUNCDESC* pFuncDesc = NULL; 
    TYPEATTR* pAttr; 
    hr = pTypeInfo->GetTypeAttr(&pAttr); 
    if (FAILED(hr)) 
      return hr; 
    int i; 
    for (i=0;i <pAttr->cFuncs;i++) 

      hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc); 
      if (FAILED(hr)) 
        return hr; 
      if (pFuncDesc->memid == dispidMember) 
        break; 
      pTypeInfo->ReleaseFuncDesc(pFuncDesc); 
      pFuncDesc = NULL; 

    pTypeInfo->ReleaseTypeAttr(pAttr); if (pFuncDesc != NULL) 

      // do something 
    }
      

  3.   

    没有直接方法,遍历其实损失不了多少性能。我上面的代码其实是拷贝的ATL中封装的一个函数,你自己可以去看看AtlGetFuncInfoFromId