原文
介绍
快捷方式
是扩展名
为每个文件
都包含一个另一个文件
的特殊COM
对象的.lnk
的文件.
一般,试打开.lnk
文件时,系统会打开此快捷方式
指向文件.
以下实验.在某处创建
一个(扩展名为.txt
的文件)文本文件.然后创建一个此文件的快捷方式
.
然后试用字
打开快捷方式,使用File->Open
命令并选择刚创建的快捷方式
.MSWord
可正确地完成:它打开此快捷方式指向的文本文件
.
现在对记事本
同样.你会看到垃圾
,而不是文本文件内容
.即记事本不知道如何处理快捷方式
.
所以得出了一个结论
:在窗口
中,为了正确处理它们
,程序应该内置支持快捷方式
.
本文中,我展示如何完成.我展示了2个函数
:如何创建和解析快捷方式
.该代码注释良好
.
代码
/* 函数`......:CreateShortcut`参数....:lpszFileName:指定有效文件名的串,*lpszDesc`,指定快捷方式描述的串`*lpszShortcutPath,`指定快捷方式的路径和文件名的串*返回`....... `:成功时`S_OK`,失败时错误码*描述...:创建`壳`链接对象(快捷方式)*/HRESULT CreateShortcut(/*进*/ LPCTSTR lpszFileName, /*进*/ LPCTSTR lpszDesc, /*进*/ LPCTSTR lpszShortcutPath)
{HRESULT hRes = E_FAIL;DWORD dwRet = 0;CComPtr<IShellLink> ipShellLink;//对`驱动和路径`,接收`无效`结尾的`串的缓冲`TCHAR szPath[MAX_PATH];//接收`路径`中`最终文件名组件`的`地址缓冲`LPTSTR lpszFilePart;WCHAR wszTemp[MAX_PATH];//提取`指定文件`的`完整路径和文件名`.dwRet = GetFullPathName(lpszFileName, sizeof(szPath) / sizeof(TCHAR), szPath, &lpszFilePart);if (!dwRet)return hRes;//取`IShellLink`接口指针hRes = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&ipShellLink);if (SUCCEEDED(hRes)){//取`IPersistFile`接口指针CComQIPtr<IPersistFile> ipPersistFile(ipShellLink);//设置`快捷方式目标`的路径,并添加描述hRes = ipShellLink->SetPath(szPath);if (FAILED(hRes))return hRes;hRes = ipShellLink->SetDescription(lpszDesc);if (FAILED(hRes))return hRes;//`IPersistFile`正在使用`LPCOLESTR`,因此请确保串为`统一码`
#if !defined _UNICODEMultiByteToWideChar(CP_ACP, 0, lpszShortcutPath, -1, wszTemp, MAX_PATH);
#elsewcsncpy(wszTemp, lpszShortcutPath, MAX_PATH);
#endif//在磁盘中写入快捷方式hRes = ipPersistFile->Save(wszTemp, TRUE);}return hRes;
}/*函数......:ResolveShortcut参数....:lpszShortcutPath,指定`快捷方式的路径和文件名的串`,*lpszFilePath,包含文件名的串*,`返回:成功时`S_OK`,失败时错误码*描述.解析`壳`链接对象*/HRESULT ResolveShortcut(/*进*/ LPCTSTR lpszShortcutPath, /*外*/ LPTSTR lpszFilePath)
{HRESULT hRes = E_FAIL;CComPtr<IShellLink> ipShellLink;//对`驱动和路径`,接收`无效`结尾的串的缓冲TCHAR szPath[MAX_PATH];//`缓冲`接收`描述`的`无效`结尾的串TCHAR szDesc[MAX_PATH];//接收`快捷方式`信息的结构WIN32_FIND_DATA wfd;WCHAR wszTemp[MAX_PATH];lpszFilePath[0] = '\0';//取指向`IShellLink`接口指针hRes = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&ipShellLink);if (SUCCEEDED(hRes)){//取`IPersistFile`接口指针CComQIPtr<IPersistFile> ipPersistFile(ipShellLink);//`IPersistFile`正在使用`LPCOLESTR`,因此请确保串为`统一串`
#if !defined _UNICODEMultiByteToWideChar(CP_ACP, 0, lpszShortcutPath, -1, wszTemp, MAX_PATH);
#elsewcsncpy(wszTemp, lpszShortcutPath, MAX_PATH);
#endif//打开快捷方式文件,并从其内容初化它hRes = ipPersistFile->Load(wszTemp, STGM_READ);if (SUCCEEDED(hRes)){//即使`已移动或重命名它`,也试查找快捷方式的目标hRes = ipShellLink->Resolve(NULL, SLR_UPDATE);if (SUCCEEDED(hRes)){//取快捷方式目标的路径hRes = ipShellLink->GetPath(szPath, MAX_PATH, &wfd, SLGP_RAWPATH);if (FAILED(hRes))return hRes;//取目标的描述hRes = ipShellLink->GetDescription(szDesc, MAX_PATH);if (FAILED(hRes))return hRes;lstrcpyn(lpszFilePath, szPath, MAX_PATH);}}}return hRes;
}
使用代码
以下代码
展示如何使用这些函数
.
void HowToCreateShortcut()
{LPCTSTR lpszFileName = _T("C:\\Work\\Window.exe");LPCTSTR lpszShortcutDesc = _T("Anything can go here");LPCTSTR lpszShortcutPath =
_T("C:\\Documents and Settings\\Administrator\\Desktop\\Sample Shortcut.lnk");CreateShortcut(lpszFileName, lpszShortcutDesc, lpszShortcutPath);
}
void HowToResolveShortcut()
{LPCTSTR lpszShortcutPath =
_T("C:\\Documents and Settings\\Administrator\\Desktop\\Sample Shortcut.lnk");TCHAR szFilePath[MAX_PATH];ResolveShortcut(lpszShortcutPath, szFilePath);
}