Я все еще чувствую себя в C ++ и являюсь новичком в ATL, поэтому я прошу прощения, если это основной вопрос.Я начинаю с существующего исполняемого проекта VC ++, обладающего функциональностью, которую я хотел бы представить как объект ActiveX (при совместном использовании как можно большего количества исходного кода между двумя проектами).
Я подошел к этому, добавив проект 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.
Есть мысли?