转载自: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;
}