Cpp操作Windows快捷方式
总结主要有二个操作:
新建 和 解析
主要用到的是COM组件 IShellLink 和 IPersistFile
需要添加的头文件 shlobj.h
IPersistFile主要用到两个成员函数:
1、Load 读取函数
原型:
HRESULT Load(
LPCOLSTR pszFileName, //快捷方式的文件绝对路径
DWORD dwMode //读取模式
);
如果dwMode为 0,则实现应使用用户打开文件时使用的任何默认权限打开文件。
dwMode取自STGM枚举,例如:
STGM_READ:只读
STGM_WRITE:只写
STGM_READWRITE:读写
2、Save 保存内容到文件
原型:
HRESULT Save(
LPCOLESTR pszFileName, //应保存到的绝对路径。若为NULL,则将其数据保存到当前文件(若存在)。
BOOL fRemember //是否将pszFileName参数用作当前工作文件。
//TRUE:保存当前文件。
//FALSE:将副本另存为...操作。
//如果pszFileName为NULL,则忽略。
);
操作步骤
一、初始化COM接口
二、创建IShellLink对象
三、从IShellLink对象中获取IPersistFile对象接口
四、操作IShellLink对象
五、释放IPersistFile对象接口
六、释放IShellLink对象
七、释放COM接口
Cpp示例代码:
// win10
// 在桌面上创建快捷方式
#include <cstdio>
#include <shlobj.h>
int main()
{
HRESULT hRet;
IShellLink* pLink; //IShellLink对象指针
IPersistFile* ppf; //IPersisFil对象指针
WCHAR wsz[MAX_PATH]; //定义Unicode字符串
//初始化COM库
hRet = ::CoInitialize(nullptr);
if (hRet != S_OK)
{
//初始化COM库失败,直接返回
printf("初始化COM库失败");
return 0;
}
//创建IShellLink实例
hRet = ::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);
if (hRet != S_OK)
{
printf("创建IShellLink实例失败\n");
}
else
{
//创建IShellLink实例成功,继续操作
//从IShellLink对象中获取IPersistFile接口
hRet = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (hRet != S_OK)
{
printf("获取IPersistFile接口失败\n");
}
else
{
//获取接口成功,继续操作
//设置快捷方式中的程序路径
pLink->SetPath("c://aa.exe");
//设置快捷方式的工作目录
pLink->SetWorkingDirectory("c://");
//确保快捷方式路径由ANSI字符串组成
LPCSTR lpstr;
lpstr = "C://Users//username//Desktop//创建的快捷方式.lnk";
MultiByteToWideChar(CP_ACP, 0, lpstr, -1, wsz, MAX_PATH);
//保存快捷方式
ppf->Save(wsz, TRUE);
}
}
//释放IPersistFile接口
ppf->Release();
//释放IShellLink对象
pLink->Release();
//释放COM接口
::CoUninitialize();
return 0;
}
获取桌面文件目录或当前文件目录请看C/Cpp获取桌面目录和当前文件目录