您的位置:首页 > 文旅 > 旅游 > 2408wtl,解析快捷方式

2408wtl,解析快捷方式

2024/10/9 21:45:38 来源:https://blog.csdn.net/fqbqrr/article/details/141758533  浏览:    关键词:2408wtl,解析快捷方式

原文

介绍

快捷方式扩展名每个文件都包含一个另一个文件的特殊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);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com