1. 程式人生 > >通過LNK檔案(快捷方式)解析出目標檔案的路徑

通過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;
 
}