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