Получить указатель на интерфейс IUpdate2

У меня есть следующий фрагмент кода,

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,

1

Решение

Ваш get_Item() член вашей коллекции требует IUpdate указатель интерфейса; не IUpdate2 указатель интерфейса

Примечание: этот код абсолютно пронизана с ошибками, плохой практикой и утечками памяти. Среди них:

  • Указатели интерфейса, которые никогда не выпускаются
  • БСТР, которые никогда не освобождаются.
  • 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--;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]