// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的
#include <atlbase.h>
#include <atlstr.h>
// TODO: 在此处引用程序需要的其他头文件
// COMDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <comdef.h> // 主要定义了_com_error类,支持COM中的错误信息,对HRESULT进行友好的解释很有用
#include <objbase.h>
#include <wininet.h>
#include <shlobj.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
WCHAR wszWallpaper[MAX_PATH];
CString strPath;
HRESULT hr;
IActiveDesktop* pIAd;
// 1. 初始化COM库(让windows 加载DLLs)。通常是在程序的InitInstance() 中调用
// CoInitialize(NULL) 或其它启动代码, MFC 程序使用AfxOleInit()
CoInitialize(NULL);
// 2. 使用外壳提供的活动桌面组件对像创建COM对像
// 第4个参数通知COM需要什么接口(这里是IActiveDesktop)
hr = CoCreateInstance(CLSID_ActiveDesktop, // coclass 的CLSID
NULL, // 这个参数只用于COM对像的聚合,利用它向现有的coclass
// 添加新方法,参数为null代表不使用聚合
CLSCTX_INPROC_SERVER, // 表示使用COM服务器的种类,本列中使用最简单的方法,一个进
// 程内DLL
IID_IActiveDesktop, // 请求接口的IID,
(void**)&pIAd); // 接口指针的地址。COM库通过这个参数的返回请求的接口
if (SUCCEEDED(hr)){
// 3. 如果COM对像创建成功,则调用这个对像的GetWallPaper() 方法
// 这里最后一个参数,不管上哪个,都一样????????
hr = pIAd->GetWallpaper(wszWallpaper, MAX_PATH, AD_GETWP_LAST_APPLIED);
if (SUCCEEDED(hr)){
// 4.如果调用GetWallpaper 成功,则返回它的文件名字
// 注: 这里要使用wcout,这里的wcout是unicode专用的,与cout的作用相同。
std::wcout << _T("Wallpaper path is:
")<< wszWallpaper << std::endl;
}
else
{
std::wcout << _T("GetWallpaper() Failed.") << std::endl;;
}
// 5. 释放接口
pIAd->Release();
}
else
{
std::wcout << _T("CoCreateInstance() failed.") << std::endl;
}
// 6. 回收COM库。MFC 不用这一步,它会自动完成
CoUninitialize();
return 0;
}