2010-06-11 85 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的AX項目,很自然地,定義_ATL_DLL,但我看不到的地方,將有所作爲。)

我目前的解決辦法是使用一個正常的「啞」指針,就像這樣:

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

如果我記得發佈它,那就行得通了。但我寧願使用ATL聰明的東西。

有什麼想法?

回答

4

你可能已經忘記了命名空間ATL

ATL :: CComQIPtr

+0

嗯,就是這樣,我是對的:這是一個過於基本的問題。但是現在我很好奇它爲什麼在一個項目中成功編譯,而不是另一個。好吧 。 。 。 – 2010-06-11 11:32:06

相關問題