COM 使用MFC建立快捷方式
2022-02-23
42
0
“快捷方式”组件的结构示意图:
“快捷方式”组件(CLSID_ShellLink),有3个(其实不止)接口,每个接口有一组相关功能的函数。
- IShellLink 接口(IID_IShellLink)提供快捷方式的参数读写功能
- IPersistFile接口(IID_IPersistFile)提供快捷方式持续性文件的读写功能。
对象的持续性,是一个常用且功能强大的接口家族。了解其中两个函数:IPersistFile::Save和IPersistFile:Load。
在D盘创建一个NOTEPAD的快捷方工式。
#include < atlconv.h >
void CreateShortcut(LPCTSTR lpszExe, LPCTSTR lpszLnk)
{
//建立块捷方式。参数lpszExe:EXE文件全路径名;lpszLnk:快捷方式文件全路径名
IShellLink* psl = NULL;
IPersistFile* ppf = NULL;
TCHAR szWorkPath[MAX_PATH]; //根据EXE的文件名,得到目录名
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_ShellLink, //启动组件。快捷方式CLSID
NULL, //聚合用
CLSCTX_INPROC_SERVER, //进程内(Shell32.dll)服务
IID_IShellLink, //IShellLink的IID
(LPVOID*)&psl); //得到接口指针
if (SUCCEEDED(hr))
{
psl->SetPath(lpszExe); //全路径程序名
// psl->SetArguments(); //命令行参数
// psl->SetDescription(); //备注
// psl->SetHotkey(); //快捷键
// psl->SetIconLocation(); //图标
// psl->SetShowCmd(); //窗口尺寸
lstrcpy(szWorkPath, lpszExe);
LPTSTR lp = szWorkPath; //定义指针变量(将szWorkPath首址存入lp中)
while (*lp)lp++; //找到串的末尾
while ('\\' != *lp)lp--; //从末尾找最后一个\符
*lp = 0;
psl->SetWorkingDirectory(szWorkPath); //设置EXE程序的默认工作目录
hr = psl->QueryInterface(IID_IPersistFile, //查找持续性文件接口指针,持续性接口IID
(LPVOID*)&ppf); //得到接口指针
if (SUCCEEDED(hr))
{
USES_CONVERSION; //转换为 UNICODE 字符串
ppf->Save(T2COLE(lpszLnk), TRUE); //保存
}
}
if (ppf)ppf->Release();
if (psl)psl->Release();
CoUninitialize();
}
void CTTDlg::OnBnClickedButton2()
{
CreateShortcut(TEXT("c:\\windows\\notepad.exe"),
TEXT("D:\\我的记事本.lnk"));
//用程序实现寻找桌面的路径,可查注册表
//HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
}