1

我有以下代码片段,

IUpdateSession *iUpdate;
IUpdateSearcher *updateSearcher;
ISearchResult* pISearchResults;
IUpdateCollection* pIUpdateCollection;
IStringCollection *pIStrCollCVEs;
IUpdate2 *pIUpdate;
long lUpdateCount;

...

CoCreateInstance(
            CLSID_UpdateSession,
            NULL,
            CLSCTX_INPROC_SERVER,
            IID_IUpdateSession,
            (LPVOID*)&iUpdate
            );

iUpdate->CreateUpdateSearcher(&updateSearcher);

printf("\n Searching updates");

updateSearcher->Search(_bstr_t(_T("IsInstalled = 0")), &pISearchResults);
printf("\n Following updates found..\n");

pISearchResults->get_Updates(&pIUpdateCollection);
pIUpdateCollection->get_Count(&lUpdateCount);

LONG lCount;
BSTR buff;
while (0 != lUpdateCount)
{
    pIUpdateCollection->get_Item(lUpdateCount, &pIUpdate);

    pIUpdate->get_CveIDs(&pIStrCollCVEs);

    pIStrCollCVEs->get_Count(&lCount);

    pIUpdate->get_Title(&buff);
    printf("TITLE : %s \n", buff);
    while(0 != lCount)
    {
        pIStrCollCVEs ->get_Item(lCount, &buff);
        _bstr_t b(buff);

        printf("CVEID = %s \n", buff);

        lCount --;
    }

    printf("\n");
    lUpdateCount --;
}


::CoUninitialize();
getchar();

错误:错误 C2664:“IUpdateCollection::get_Item”:无法将参数 2 从“IUpdate2 * *”转换为“IUpdate * *”

@Line43

如何获取指向 IUpdate2 接口的指针,

4

1 回答 1

0

get_Item()的集合成员需要一个IUpdate接口指针;不是IUpdate2接口指针。

注意:这段代码绝对充满了错误、不良做法和内存泄漏。在他们中间:

  • 从不释放的接口指针
  • BSTR 永远不会被释放。
  • 从未检查过的 HRESULT。
  • 从零开始的集合中的索引无效

仅举几个。不管以下应该解决您的接口不匹配问题。这个动物园的其余部分我留给你:

while (0 != lUpdateCount)
{
    IUpdate* pIUpd = NULL;
    HRESULT hr = pIUpdateCollection->get_Item(lUpdateCount, &pIUpd);
    if (SUCCEEDED(hr) && pIUpd)
    {
        hr = pIUpd->QueryInterface(__uuidof(pIUpdate), (LPVOID*)&pIUpdate);
        pIUpd->Release();

        if (SUCCEEDED(hr) && pIUpdate != NULL)
        {
            pIUpdate->get_CveIDs(&pIStrCollCVEs);
            pIStrCollCVEs->get_Count(&lCount);

            pIUpdate->get_Title(&buff);
            printf("TITLE : %s \n", buff);
            while(0 != lCount)
            {
                pIStrCollCVEs ->get_Item(lCount, &buff);
                _bstr_t b(buff, false);
                printf("CVEID = %s \n", buff);
                lCount --;
            }
        }
    }

    printf("\n");
    lUpdateCount--;
}
于 2013-03-07T10:50:56.363 回答