2013-03-07 2 views
1

Я следующий фрагмент кода,Получить указатель на интерфейс 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,

+0

Дайте ему правильный тип указателя интерфейса, затем запросите тот, который вам нужен позже. Кроме того, буквально * ни одна из соответствующих переменных в этом вопросе объявлена ​​здесь, что делает невозможным просмотр их типов. Пожалуйста, отправьте код, который делает * смысл *. Этот код также протекает как «Титаник». – WhozCraig

+0

Я хочу использовать интерфейс 'IUpdate2' для использования функции' get_cveIDs() '. И про утечки для COM-интерфейсов ,,, это просто попытка, а не окончательный код, поэтому отлично с этим ... :) – 51k

ответ

0

Вашим get_Item() твоей группе требуется указатель мыши IUpdate; не указатель интерфейса IUpdate2.

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

  • указателей интерфейса, которые никогда не выпускались
  • BSTR о том, что никогда не освобождены.
  • HRESULT, которые никогда не проверяются.
  • Invalid индексирование в коллекции

нулевой основе Просто назвать несколько. Независимо от того, что ниже должно быть указано несоответствие интерфейса. Остальную часть этого зверинца я оставляю вам:

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

спасибо приятель, я понятия не имел о 'QueryInterface' – 51k

+1

@ 51k Его единственная самая важная особенность COM = P. Получите книгу о COM или потратите некоторое время на веб-сайте MS, читающей об этом. Его несколько старых школьных технологий, которые были около 20 лет, но по-прежнему стоит узнать, если вы делаете то, на что похоже, что вы связаны. – WhozCraig

Смежные вопросы