Windows系统没有目标位置的快捷方式及其目标文件获取
最近的項目需要解析Windows系統(tǒng)的快捷方式(.lnk),研究發(fā)現(xiàn),雖然快捷方式的后綴都是(.lnk),但其實存在兩種不同的格式,如圖:
右側(cè)的 QQ 快捷方式則是我們常見的那種,目標(biāo)是指向一個 .exe,而左側(cè)的 python 的快捷方式并沒有目標(biāo)位置,而且目標(biāo)也不指向一個特定文件。
用 IShellLink 去解析 QQ 的快捷方式(一般的快捷方式)沒有任何問題(網(wǎng)上搜代碼一堆,這里就不貼了),但用它來獲取 python 那種圖標(biāo)就不行了,IShellLink 解 python 快捷方式,返回的目標(biāo)文件是存放在 %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 安裝包創(chuàng)建出來的快捷方式,支持各種各樣高級功能,自修復(fù)什么的。
于是,在 MSDN msi 相關(guān)的 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);?
總結(jié)
以上是生活随笔為你收集整理的Windows系统没有目标位置的快捷方式及其目标文件获取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 开发即时聊天工具系列(8
- 下一篇: html 表单 元素 美化,分享10款j