我仍然感覺我的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聰明的東西。
有什麼想法?
嗯,就是這樣,我是對的:這是一個過於基本的問題。但是現在我很好奇它爲什麼在一個項目中成功編譯,而不是另一個。好吧 。 。 。 – 2010-06-11 11:32:06