ошибка C2065: «CComQIPtr»: необъявленный идентификатор - PullRequest
2 голосов
/ 11 июня 2010

Я все еще чувствую себя в C ++ и являюсь новичком в ATL, поэтому я прошу прощения, если это основной вопрос.Я начинаю с существующего исполняемого проекта VC ++, обладающего функциональностью, которую я хотел бы представить как объект ActiveX (при совместном использовании как можно большего количества исходного кода между двумя проектами).

Я подошел к этому, добавив проект ATL к рассматриваемому решению, и в этом проекте ссылался на все файлы .h и .cpp из исполняемого проекта, добавил все соответствующие ссылки и определил всемакросы препроцессора.Все идет нормально.Но я получаю ошибку компилятора в одном файле (HideDesktop.cpp).Соответствующие части выглядят так:

  #include "stdafx.h"
  #define WIN32_LEAN_AND_MEAN
  #include <Windows.h>
  #include <WinInet.h> // Shell object uses INTERNET_MAX_URL_LENGTH (go figure)
  #if _MSC_VER < 1400
  #define _WIN32_IE 0x0400
  #endif
  #include <atlbase.h> // ATL smart pointers
  #include <shlguid.h> // shell GUIDs
  #include <shlobj.h>  // IActiveDesktop
  #include "stdhdrs.h"

  struct __declspec(uuid("F490EB00-1240-11D1-9888-006097DEACF9")) IActiveDesktop;

  #define PACKVERSION(major,minor) MAKELONG(minor,major)

  static HRESULT EnableActiveDesktop(bool enable)
  {
     CoInitialize(NULL);

     HRESULT hr;
     CComQIPtr<IActiveDesktop, &IID_IActiveDesktop> pIActiveDesktop; // <- Problematic line (throws errors 2065 and 2275)
     hr = pIActiveDesktop.CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER);
     if (!SUCCEEDED(hr))
     {
        return hr;
     }

     COMPONENTSOPT  opt;

     opt.dwSize = sizeof(opt);
     opt.fActiveDesktop = opt.fEnableComponents = enable;
     hr = pIActiveDesktop->SetDesktopItemOptions(&opt, 0);
     if (!SUCCEEDED(hr))
     {
        CoUninitialize();
        // pIActiveDesktop->Release();
        return hr;
     }

     hr = pIActiveDesktop->ApplyChanges(AD_APPLY_REFRESH);
     CoUninitialize();
     // pIActiveDesktop->Release();
     return hr;
  }

Этот код вызывает следующие ошибки компилятора:

ошибка C2065: «CComQIPtr»: необъявленный идентификатор
ошибка C2275: «IActiveDesktop»:недопустимое использование этого типа в качестве выражения
ошибка C2065: 'pIActiveDesktop': необъявленный идентификатор

Два странных бита: (1) CComQIPtr определен в atlcomcli.h, который включен в atlbase.h,который включен в HideDesktop.cpp;и (2) этот файл выдает эти ошибки только тогда, когда на него ссылаются в моем новом проекте ATL / AX: он не выбрасывает их в исходном исполняемом проекте, даже если они имеют в основном те же определения препроцессора.(Проект ATL AX, естественно, определяет _ATL_DLL, но я не могу понять, где это будет иметь значение.)

Мой текущий обходной путь - использовать обычный «тупой» указатель, например:

     IActiveDesktop *pIActiveDesktop;
     HRESULT hr = ::CoCreateInstance(CLSID_ActiveDesktop,
                     NULL, // no outer unknown
                     CLSCTX_INPROC_SERVER,
                     IID_IActiveDesktop,
                     (void**)&pIActiveDesktop);

И это работает, если я не забуду его выпустить.Но я бы предпочел использовать умный материал ATL.

Есть мысли?

1 Ответ

4 голосов
/ 11 июня 2010

Возможно, вы забыли пространство имен ATL

ATL :: CComQIPtr

...