C++生成LNK文件及LNK文件简单解析
话不多说,直接上代码吧。
生成快捷方式代码:
int CreateLnk(const wchar_t* TARGET, const wchar_t* LNKFILE)
{
if (S_OK != CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)) //初始化COM库失败
return 1;
IShellLinkW* psl;
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
if (SUCCEEDED(hr))
{
psl->SetPath(TARGET);
IPersistFile* ppf;
hr = psl->QueryInterface(&ppf);
if (SUCCEEDED(hr))
{
hr = ppf->Save(LNKFILE, TRUE);
ppf->Release();
if (!SUCCEEDED(hr))
return 2;
}
else
{
psl->Release();
return 3;
}
}
else
return 4;
CoUninitialize();
return 0;
}
简单解析快捷方式:
int ResolveLnk(wchar_t* TARGET, const wchar_t* LNKFILE)
{
if (CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE) != S_OK)
{
//初始化COM库失败
return 5;
}
IShellLinkW* psl;
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
if (SUCCEEDED(hr))
{
IPersistFile* ppf;
hr = psl->QueryInterface(&ppf);
if (SUCCEEDED(hr))
{
hr = ppf->Load(LNKFILE, STGM_READ);
if (SUCCEEDED(hr))
{
//CHAR sz_args[MAX_PATH];
hr = psl->GetPath(TARGET, MAX_PATH, NULL, SLGP_RAWPATH);
if (SUCCEEDED(hr))
{
//wcout << L"Link to: " << TARGET << endl;
CoUninitialize();
return 0;
}
else
{
cout << "Get Link to failed" << endl;
CoUninitialize();
return 1;
}
}
else
{
cout << "Open file failed" << endl;
CoUninitialize();
return 2;
}
ppf->Release();
}
else
{
cout << "System Error When read file" << endl;
CoUninitialize();
return 3;
}
psl->Release();
}
else
{
cout << "Operation failure" << endl;
CoUninitialize();
return 4;
}
}
完整测试代码已经上传到GitHub中,链接:https://github.com/WangHan0711/Lnk_Handle。欢迎各位大神指正。