使用COM接口对象获得当前桌面墙纸的文件名

    xiaoxiao2021-04-14  39

    1.开发环境WINDOWS+VS2010+MFC Dialog Based 2.为了添加接口对象类,需要在stdafx.h中的#include <afxdisp.h>行之前增加#include <wininet.h>   3.在BOOL CXXXApp的InitInstance() 函数中初始化COM库,即调用函数CoInitialize(NULL),MFC会自动完成COM库的回收,因此不需要调用 CoUninitialize() 4. 获得当前桌面壁纸的文件名 TCHAR wszWallpaper[MAX_PATH]; CString strPath; HRESULT hr; IActiveDesktop* pIAD; hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&pIAD); if (SUCCEEDED(hr)) { hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0); if (SUCCEEDED(hr)) { m_strPath.Format(L"%s", wszWallpaper); strPath.Format(L"Wallpaper path is:%s", wszWallpaper); MessageBox(strPath); } else { MessageBox(L"GetWallpaper()failed."); } pIAD->Release(); } else { MessageBox(L"CoCreateInstance failed"); } 5.为文件名创建快捷方式 if (m_strPath.IsEmpty()) { MessageBox(L"桌面壁纸文件路径获取失败!"); return; } IShellLink* pISL = NULL; IPersistFile* pIPF = NULL; do { HRESULT hr; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pISL); if (FAILED(hr)) { MessageBox(L"获取IShellLink指针失败!"); break; } hr = pISL->SetPath(m_strPath); if (FAILED(hr)) { //设置快捷方式目标(墙纸文件)的路径 MessageBox(L"设置快捷方式目标路径失败!"); break; } //获取这个对象的第二个接口(IPersistFile) hr = pISL->QueryInterface(IID_IPersistFile, (void**)&pIPF); if (FAILED(hr)) { MessageBox(L"获取接口IPersistFile失败!"); break; } hr = pIPF->Save(L"C:\\wallpaper.lnk", FALSE); if (FAILED(hr)) { MessageBox(L"创建快捷方式失败!"); break; } MessageBox(L"创建快捷方式成功!"); } while (0); if (pISL) pISL->Release(); if (pIPF) pIPF->Release(); 6. 处理HRESULT  当HRESULT返回错误码时,可以使用VC提供的错误查找工具(Error Lookup)可以轻松查到为HRESULT内建功能码。例如,假设你在CoCreateInstance()之前忘了调用CoInitialize(),CoCreateInstance()返回的值是0x800401F0。你只要将这个值输入到错误查找工具按“Look Up”按钮,便可以看到错误信息描述“尚未调用CoInitialize”。 另外一种查找HRESULT描述的方法是在调试器中。假设有一个HRESULT变量是hres。在Watch窗口的左边框中输入“hres,hr”,表示想要看的值,“hr”便会通知VC显示HRESULT所描述的值。  对于COM更详细的讲解请看:http://blog.csdn.net/wangqiulin123456/article/details/8026270
    转载请注明原文地址: https://ju.6miu.com/read-670474.html

    最新回复(0)