通過LNK檔案(快捷方式)解析出目標檔案的路徑
轉載自:https://blog.csdn.net/yoie01/article/details/8688686
尼瑪的~網上找了一堆資料都是有問題的程式碼,各種轉發,錯的東西傳來傳去,誤人子弟!!!
自己重寫了個,加上註釋,留著備用
引用頭:
#include <shlobj.h>
關鍵引用的類IShellLink:
IShellLink主要方法:
1、GetArguments:獲得引數資訊
2、GetDescription:獲得描述資訊
3、GetHotkey:獲得快捷鍵
4、GetIconLocation:獲得快捷方式圖示
5、GetIDList:獲得快捷方式的目標物件的item identifier list (Windows外殼中的每個物件如檔案,目錄和印表機等都有唯一的item identifiler list)
6、GetPath: 獲得快捷方式的目標檔案或目錄的全路徑
7、GetShowCmd:獲得快捷方式的執行方式,比如常規視窗,最大化
8、GetWorkingDirectory:獲得工作目錄
9、Resolve:按照一定的搜尋規則試圖獲得目標物件,即使目標物件已經被刪除或移動,重新命名
解析的處理流程:
1、初始化COM介面
2、建立IShellLink物件
3、從IShellLink物件中獲取IPersistFile物件介面
4、操作IShellLink物件
5、釋放IPersistFile物件介面
6、釋放IShellLink物件
7、釋放COM介面
//引數1:Lnk檔案路徑,引數2:返回存放目標路徑
bool GetShellPath(Char *Src,Char *ShellPath)
{
bool blret=false;
::CoInitialize(NULL); //初始化COM介面
IShellLink *psl = NULL;
//建立COM介面,IShellLink物件建立
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER,IID_IShellLink, (LPVOID *)&psl);
if (SUCCEEDED(hr))
{
IPersistFile *ppf ;
hr=psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hr))
{
WCHAR wsz[MAX_PATH] ;
MultiByteToWideChar( CP_ACP, 0, Src, -1, wsz, MAX_PATH ) ; //轉下寬位元組
hr=ppf->Load(wsz, STGM_READ); //載入檔案
if (SUCCEEDED(hr))
{
WIN32_FIND_DATA wfd ;
psl->GetPath(ShellPath,MAX_PATH, (WIN32_FIND_DATA*)&wfd,SLGP_SHORTPATH); //獲取目標路徑
blret=true;
}
ppf->Release();
}
psl->Release(); //釋放物件
}
::CoUninitialize(); //釋放COM介面
return blret;
}