当前位置: 首页 > news >正文

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);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解决UOS开发截图时电脑滴滴声
  • 求解组合优化问题的具有递归特征的无监督图神经网络
  • fastadmin后台报expandOnHover错误
  • Edible Fish 可食用鱼
  • 核心交换机的六个基础知识
  • ISO 26262中的失效率计算:SN 29500-11 Expected values for contactors
  • 1、正则表达式
  • 苹果手机通话记录怎么恢复?已总结了4个方法,快速恢复
  • 【WPF中的图形(Shape)】
  • Redis的内存淘汰策略- allkeys-lru
  • 【Vue】Vue3.5 新特性
  • Gin自定义校验函数
  • 数学建模常见模型(上)
  • 什么是开放式耳机?五大热门开放式耳机大测评!
  • iMeta: 南医大余光创组ggtree最新文章-系统发育树存储与可视化的数据结构
  • “大数据应用场景”之隔壁老王(连载四)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Leetcode】104. 二叉树的最大深度
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • iOS小技巧之UIImagePickerController实现头像选择
  • Js基础知识(四) - js运行原理与机制
  • RxJS: 简单入门
  • Yii源码解读-服务定位器(Service Locator)
  • 代理模式
  • ------- 计算机网络基础
  • 两列自适应布局方案整理
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 世界上最简单的无等待算法(getAndIncrement)
  • -- 数据结构 顺序表 --Java
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (03)光刻——半导体电路的绘制
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (HAL库版)freeRTOS移植STMF103
  • (python)数据结构---字典
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)PySpark3:SparkSQL编程
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (九)信息融合方式简介
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)h264中avc和flv数据的解析
  • (转载)hibernate缓存
  • (自用)gtest单元测试
  • .gitignore
  • .NET 4.0中的泛型协变和反变
  • .NET Core Web APi类库如何内嵌运行?
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET Micro Framework 4.2 beta 源码探析