2010-06-11 122 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

相关问题