COM_利用GetWallpaper()获取墙纸路径

// 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;
}

原文地址:https://www.cnblogs.com/laohaozi/p/12538067.html