Я все еще чувствую свой путь вокруг 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.
Любые мысли?
Ну, что это было, и я был прав: он был чрезмерно основной вопрос. Но теперь мне любопытно, почему он успешно компилируется в одном проекте, а не в другом. Ну что ж . , , –