2010-06-11 2 views
2

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

Я подошел к этому, добавив проект 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, естественно, определяет _ATL_DLL, но я не могу видеть, где это будет иметь значение.)

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

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

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

Любые мысли?

ответ

4

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

ATL :: CComQIPtr

+0

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

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