Windows 如何从microsoft office shotcuts(例如Word 2013.lnk)中获取targetPath、workingDir信息
尝试使用IShellLink COM接口获取.LNK文件的信息。 它适用于许多应用场合 但是对于Microsoft Office应用程序快捷方式,它没有提供正确的信息 例如: 读取ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Word 2013.lnk时 IShellLink::GetPath返回“C:\Windows\Installer{90150000-0011-0000-0000-0000000 FF1CE}\wordicon.exe” 不是C:\ProgramFiles(x86)\Microsoft Office\Office15\WINWORD.exe 有没有办法从这些.lnk文件中获取目标信息。windows使用什么 在双击shorcut时启动应用程序 @丹尼斯Windows 如何从microsoft office shotcuts(例如Word 2013.lnk)中获取targetPath、workingDir信息,windows,winapi,windows-shell,win32com,advertised-shortcut,Windows,Winapi,Windows Shell,Win32com,Advertised Shortcut,尝试使用IShellLink COM接口获取.LNK文件的信息。 它适用于许多应用场合 但是对于Microsoft Office应用程序快捷方式,它没有提供正确的信息 例如: 读取ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Word 2013.lnk时 IShellLink::GetPath返回“C:\Windows\Installer{90150000-0011-0000-0000-000000
这是我尝试过的
的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;
}
}
}
}
}
}
}
函数GetExeNameFromShellLink(AShellLink:IShellLink):UnicodeString;
变量列表:IShellLinkDataList;
旗帜:德沃德,;
懒惰者:可怜的人;
ShellFolder:IShellFolder;
ChildItem:PItemIDList;
Attr:DWORD;
StrRet:TStrRet;
开始
如果成功(AShellLink.QueryInterface(IShellLinkDataList,List)),则
尝试
如果成功(List.GetFlags(Flags))和(Flags和SLDF_具有_达尔文ID 0),则
解析(0,SLR_调用_MSI);
最后
列表:=零;
终止
olcheck(AShellLink.GetIDList(IDList));
尝试
olcheck(SHBindToParent(IDList、IShellFolder、指针(ShellFolder)、ChildItem));
尝试
olcheck(ShellFolder.GetDisplayNameOf(ChildItem,SHGDN_NORMAL或SHGDN_FORPARSING,stret));
case StrRet.uType of
STRRET_WSTR:
开始
结果:=StrRet.pOleStr;
CoTaskMemFree(StrRet.pOleStr);
终止
stret_偏移量:
开始
Inc(PByte(ChildItem),StrRet.uOffset);
结果:=单破坏(PAnsiChar(ChildItem));
终止
STRRET_CSTR:
结果:=UnicodeString(AnsiString(StrRet.cStr));
其他的
结果:='';
终止
最后
ShellFolder:=nil;
终止
最后
CoTaskMemFree(空闲);
终止
终止
< C++ >代码> >更多信息:我读到这些广告被称为广告快捷方式,但仍然不知道如何从这样的短信息中获取目标信息。上面还返回了相同的路径:C++:\\\\\\1515000—011-00,0000000,FF1CE}\Wordon .exe。对于Word 2013.LNKI,使用C++,我尝试了相应的API,用于C++,已在post中添加了代码,但不起作用。@user807688我在代码中没有看到psl->Resolve(0,SLR\u INVOKE\u MSI)。
function GetExeNameFromShellLink(AShellLink: IShellLink): UnicodeString;
var List: IShellLinkDataList;
Flags: DWORD;
IDList: PItemIDList;
ShellFolder: IShellFolder;
ChildItem: PItemIDList;
Attr: DWORD;
StrRet: TStrRet;
begin
if Succeeded(AShellLink.QueryInterface(IShellLinkDataList, List)) then
try
if Succeeded(List.GetFlags(Flags)) and (Flags and SLDF_HAS_DARWINID <> 0) then
AShellLink.Resolve(0, SLR_INVOKE_MSI);
finally
List := nil;
end;
OleCheck(AShellLink.GetIDList(IDList));
try
OleCheck(SHBindToParent(IDList, IShellFolder, Pointer(ShellFolder), ChildItem));
try
OleCheck(ShellFolder.GetDisplayNameOf(ChildItem, SHGDN_NORMAL or SHGDN_FORPARSING, StrRet));
case StrRet.uType of
STRRET_WSTR:
begin
Result := StrRet.pOleStr;
CoTaskMemFree(StrRet.pOleStr);
end;
STRRET_OFFSET:
begin
Inc(PByte(ChildItem), StrRet.uOffset);
Result := UnicodeString(PAnsiChar(ChildItem));
end;
STRRET_CSTR:
Result := UnicodeString(AnsiString(StrRet.cStr));
else
Result := '';
end;
finally
ShellFolder := nil;
end;
finally
CoTaskMemFree(IDList);
end;
end;