1.在“stdafx.h”中,在 #include <afxwin.h> // MFC 核心和标准组件 #include <afxext.h> // MFC 扩展 #include <afxdisp.h> // MFC 自动化类 前面加上 #include <afx.h> #include <wininet.h> 这两个头文件顺序不可颠倒 即: #include <afx.h> #include <wininet.h> #include <afxwin.h> // MFC 核心和标准组件 #include <afxext.h> // MFC 扩展 #include <afxdisp.h> // MFC 自动化类
2.使用 CoInitialize(NULL) 和 CoUninitialize() 初始化和终止 COM 使用环境。
3.在使用了 ATL COM 接口的源文件头部,包含声明该 ATL COM 接口的头文件即可。 IActiveDesktop =》#include <shlobj.h>
一个使用 ATL COM 的例子:BOOL CSystemSet::SetWallPaper(CString strImaglePath, DWORD dwStyle){ CoInitialize(NULL);
BOOL bRet = FALSE; HRESULT hr = S_FALSE; IActiveDesktop* pIAD = NULL;
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**) &pIAD ); if (SUCCEEDED(hr)) { BOOL bActiveDesktop = FALSE;
COMPONENTSOPT co; co.dwSize = sizeof(co); if (SUCCEEDED(pIAD->GetDesktopItemOptions(&co, 0))) { if (!co.fActiveDesktop || !co.fEnableComponents) { co.fActiveDesktop = TRUE; co.fEnableComponents = TRUE; if (SUCCEEDED(pIAD->SetDesktopItemOptions(&co, 0))) bActiveDesktop = TRUE; } else bActiveDesktop = TRUE; } if (bActiveDesktop) { WCHAR wszWallpaper [MAX_PATH]; ZeroMemory(wszWallpaper, sizeof(wszWallpaper));
#if defined(_UNICODE) CopyMemory(wszWallpaper, strImaglePath.GetBuffer(0), min(MAX_PATH * sizeof(TCHAR), (strImaglePath.GetLength() + 1) * sizeof(TCHAR))); #else MultiByteToWideChar(CP_ACP, 0, strImaglePath, -1, wszWallpaper, MAX_PATH); #endif
WALLPAPEROPT wpo; wpo.dwSize = sizeof(wpo); wpo.dwStyle = dwStyle; if (SUCCEEDED(hr = pIAD->SetWallpaper(wszWallpaper, 0)) && SUCCEEDED(hr = pIAD->SetWallpaperOptions(&wpo, 0)) && SUCCEEDED(hr = pIAD->ApplyChanges(AD_APPLY_ALL)) && SUCCEEDED(hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0))) { bRet = TRUE; } } pIAD->Release(); }
CoUninitialize(); return bRet;}