2408wtl,解析快捷方式

devtools/2024/12/23 3:55:54/

原文

介绍

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

http://www.ppmy.cn/devtools/107422.html

相关文章

进程的那些事——了解进程(虚拟地址空间)

目录 前言 一、程序地址空间&#xff08;虚拟地址空间&#xff09; 二、虚拟地址寻找物理内存 1.页表 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 程序和进程之间的区别&#xff1a; 进程&#xff1a;对用户而言&#xff0c;进程是运行中的…

【gtokentool】什么是数字货币?怎么使用?

一、什么是数字货币 数字货币是一种基于密码学原理&#xff0c;独立于传统银行体系运行的电子货币形式。数字货币具有以下特点&#xff1a; 去中心化&#xff1a;数字货币采用去中心化的交易验证方式&#xff0c;不依赖于任何中央机构或政府。安全性高&#xff1a;通过加密算法…

Windows下安装ELK8(elasticsearch、logstash、kibana)及相关工具插件

目录 概述 ELK简介 安装elasticsearch 下载elasticsearch 解压 配置不用登录及关闭SSL 启动elasticsearch 访问elasticsearch 安装elasticsearch-head 提前准备node.js 下载elasticsearch-head 解压 浏览器打开index.html 安装kibana 下载kibana 解压 运行kib…

Vue Router 和 组合式 API

Vue 的组合式 API 的引入开辟了新的可能性&#xff0c;但要想充分发挥 Vue Router 的潜力&#xff0c;我们需要使用一些新的函数来代替访问 this 和组件内导航守卫。 在 setup 中访问路由和当前路由​ 因为我们在 setup 里面没有访问 this&#xff0c;所以我们不能直接访问 t…

理解 Maven 依赖范围及编译与运行时的需求

在使用 Maven 构建 Java 项目时&#xff0c;我们经常需要添加各种依赖&#xff08;JAR 包&#xff09;到项目中。然而&#xff0c;依赖的作用范围&#xff08;Scope&#xff09;决定了这些 JAR 包在不同阶段的作用和存在方式。本文将详细介绍 Maven 依赖范围的定义、编译和运行…

EmguCV学习笔记 VB.Net 9.2 VideoWriter类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

阶段二 - 小程序反编译及调试

在打开小程序后&#xff0c;小程序的apkg会放在以下目录中&#xff1a; 使用解包工具对小程序进行解包&#xff1a; 解包工具&#xff1a;链接: https://pan.baidu.com/s/1KLDbivGPCPhqt1nbLVbhXA?pwdkckq 提取码: kckq 解包后会生成一个这样的文件&#xff1a; 在这里输…

6、关于Medical-Transformer

6、关于Medical-Transformer Axial-Attention原文链接&#xff1a;Axial-attention Medical-Transformer原文链接&#xff1a;Medical-Transformer Medical-Transformer实际上是Axial-Attention在医学领域的运行&#xff0c;只是在这基础上增加了门机制&#xff0c;实际上也就…