通过LNK文件(快捷方式)解析出目标文件的路径

尼玛的~网上找了一堆资料都是有问题的代码,各种转发,错的东西传来传去,误人子弟!!!

自己重写了个,加上注释,留着备用

引用头:

#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;

}


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值