Пытался использовать COM-интерфейс IShellLink для получения информации о файлах .LNK. Он отлично работает для многих ярлыков приложений, но для ярлыков приложений Microsoft Office Он не предоставляет правильную информацию. Например:
при чтении ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Microsoft Office 2013 \ Word 2013.lnk
IShellLink :: GetPath возвращает "C: \ Windows \ Installer {90150000-0011-0000-0000-0000000FF1CE} \ wordicon.exe"
не C: \ Program Files (x86) \ Microsoft Office \ Office15 \ WINWORD.exe
Есть ли способ получить информацию о цели из таких файлов .lnk. какие окна используются для запуска приложения при двойном щелчке по ярлыку.
@Денис
Вот код C ++, который я пробовал
IShellLinkDataList* comShellLinkDataList;
if (SUCCEEDED(psl->QueryInterface(IID_IShellLinkDataList,(void**)&comShellLinkDataList)))
{
DWORD flags = 0;
if (SUCCEEDED(comShellLinkDataList->GetFlags(&flags)))
{
if (flags & SLDF_HAS_DARWINID)
{
PIDLIST_ABSOLUTE pidList;
if (SUCCEEDED(psl->GetIDList(&pidList)))
{
IShellFolder* shellFolder;
PCITEMID_CHILD childItem;
if (SUCCEEDED(SHBindToParent(pidList, IID_IShellFolder, (void**)&shellFolder, &childItem)))
{
STRRET strRet;
if (SUCCEEDED(shellFolder->GetDisplayNameOf(childItem, SHGDN_NORMAL | SHGDN_FORPARSING, &strRet)))
{
TCHAR path[MAX_PATH] = {0};
if (SUCCEEDED(StrRetToBuf(&strRet, childItem, path, MAX_PATH)))
{
return path;
}
}
}
}
}
}
}