Windows系统没有目标位置的快捷方式及其目标文件获取
最近的项目需要解析Windows系统的快捷方式(.lnk),研究发现,虽然快捷方式的后缀都是(.lnk),但其实存在两种不同的格式,如图:
右侧的 QQ 快捷方式则是我们常见的那种,目标是指向一个 .exe,而左侧的 python 的快捷方式并没有目标位置,而且目标也不指向一个特定文件。
用 IShellLink 去解析 QQ 的快捷方式(一般的快捷方式)没有任何问题(网上搜代码一堆,这里就不贴了),但用它来获取 python 那种图标就不行了,IShellLink 解 python 快捷方式,返回的目标文件是存放在 %appdata%\Roaming\Microsoft\Installer\{DCD5B320-89D9-4C7C-9E8B-84496588744D}\python_icon.exe。
在 MSDN 折腾了半天,搜到了 stackoverflow 的这个:
https://stackoverflow.com/questions/11776023/advertised-shortcuts-vs-non-advertised-shortcuts-in-windows-setup-project
里面有位大佬这么说:
大概就是说像 python 这种快捷方式就是一个 advertised shortcut,是 msi 安装包创建出来的快捷方式,支持各种各样高级功能,自修复什么的。
于是,在 MSDN msi 相关的 API 中,中找到了这个接口 MsiGetShortcutTargetW ,里面的 Remark 写道:
翻译下就是:如果这个 API 加载了这个快捷方式失败了,就用 IShellLink 接口获取,否则这就是个 Advertised Shortcut了。OK,看到这,问题解决了。
贴下 MsiGetShortcutTarget 的代码:
#include <msi.h>
#pragma comment(lib, "msi.lib")//
//Get the target file of a advertised shortcut
//
BOOL GetMsiShortCutTarget(LPCWSTR strShortcutFile, LPWSTR strTargetFile, DWORD& nSize)
{if (!strShortcutFile || !strTargetFile)return FALSE;//Extract from msi api. See: Windows Installer Advertised ShortcutsWCHAR szProductCode[39] = {};WCHAR szComponentCode[39] = {};if (S_OK == MsiGetShortcutTarget(strShortcutFile, szProductCode, NULL, szComponentCode)){INSTALLSTATE nState = MsiGetComponentPath(szProductCode, szComponentCode, strTargetFile, &nSize);if (nState == INSTALLSTATE_LOCAL || nState == INSTALLSTATE_SOURCE){return TRUE;}}//TODO Extract from IShellLink//...return FALSE;
}//usage
WCHAR szTargetFile[MAX_PATH] = {};
DWORD dwSize = MAX_PATH;
GetMsiShortCutTarget(L"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Python 2.7\\IDLE (Python GUI).lnk", szTargetFile, dwSize);
OutputDebugString(szTargetFile);
Windows系统没有目标位置的快捷方式及其目标文件获取相关推荐
- 怎么恢复服务器电脑删除的文件,windows系统中u盘上被删除的文件怎么恢复?_网站服务器运行维护,windows,u盘,删除,恢复...
win10装cad提示权限不够怎么办?_网站服务器运行维护 解决方法:跳过管理员权限来进行安装.步骤:1.在经常要使用的程序上右键单击,选择"兼容性疑难解答":2.点击" ...
- RoboMaster视觉教程(5)目标位置解算(通过像素点获取转角)
RoboMaster视觉教程(5)目标位置解算(通过像素点获取转角) 概览 直接使用像素坐标的缺陷 摄像头标定 根据小孔成像原理得到需要的转角 角度测量验证 概览 在识别到目标后,有一个很重要的问题: ...
- linux补丁更新服务器地址,windows系统之WSUS服务器:更改WSUS更新文件的路径
wsus补丁硬盘空间不够 wsus补丁硬盘空间不够.我部署了WSUS服务器,使用正常,现在由于补丁下载的硬盘空间不够了,我想把补丁下载的路径改到一个比较大的硬盘上,该怎么操作? 当磁盘不足的时候,如果 ...
- windows:windows系统上的常用软件工具快捷方式
windows 常用命令 查看端口的使用情况 netstat -ano // 查看所有的端口使用情况 用命令以管理员的方式打开文件 notepad 文件 IDEA 快捷键 编辑类 #光标多点 Shif ...
- windows系统中使用cmd中type命令查看文件内容
在windows的cmd中输入如下命令: type 文件名 可以查看文件中的内容
- Windows系统,如何查看正在被使用的文件(夹)被占用情况
每当我们要删除文件或文件夹时,经常会出现文件因为正在被占用而导致无法删除,如图: 如果当你必须要删除这个文件(夹),却又不知道被哪个程序占用,可用如下方法: 打开windows的任务管理器 选择[性能 ...
- windows系统下递归遍历目录下的所有文件
c++代码如下: int GetAllFilepathFromfolder(char* Path) {char szFind[MAX_PATH];WIN32_FIND_DATA FindFileDat ...
- windows系统bat批处 注册一个exe执行文件变成服务
在.exe的同级目录下写 .bat 软件名字.exe --service-install 服务名字 --service-start服务名字 --service-stop 服务名字 --service- ...
- 破解系统密码与重装windows系统
数据来源 一.利用5次shift漏洞破解win7密码 1.1 漏洞 1. 在未登录时,连续按5次shift键,弹出程序C:\Windows\System32\sethc.exe 2 ...
- Silvaco TCAD 2012(2014) 在Windows系统的安装教程
Silvaco TCAD 2012(2014) 在Windows系统的安装教程 1.运行安装文件:Silvaco-tcad-2012-00-win,在"Install License Ser ...
最新文章
- 我理解的【旁路代理】
- HDU-5123-who is the best?
- 学习笔记(28):Python网络编程并发编程-死锁与递归锁
- 成为高手前必懂的TCP干货
- 二叉树遍历代码_二叉树的题,就那几个框架,枯燥至极
- php 生成随机数组,利用php如何获取随机数组列表
- 移动磁盘显示由于IO设备错误,无法运行此项请求要怎样寻回资料
- 安全结束线程 linux,启动线程以及安全终止线程
- windows10如何注销
- 三年级计算机上册期末测试题,三年级上册期末试卷
- Masimo与Penington研究所合作,提升公众对处方阿片类药物过量危害的认识
- BZOJ 3162:独钓寒江雪
- php打开EXCEL过慢,打开excel很慢,编辑某个工作表很卡
- 关于GX WORKS2中M8002、M8012、M8013无法使用的问题
- PC端 kindle 导入 电子书
- 某音提取真机cookie,cookie参数解密
- python -m pip install --upgrade pip
- Application context和Activity context的区别
- centos怎么卸载mysql
- 看ChatGPT这形势,留给我们开发人员的时间不多了