如何从 Microsoft Office 截图中获取 targetPath、workingDir 信息(例如 Word 2013.lnk)
Posted
技术标签:
【中文标题】如何从 Microsoft Office 截图中获取 targetPath、workingDir 信息(例如 Word 2013.lnk)【英文标题】:How to get targetPath, workingDir information from microsoft office shotcuts(eg. Word 2013.lnk) 【发布时间】:2014-01-18 11:02:51 【问题描述】:尝试使用 IShellLink COM 接口获取 .LNK 文件的信息。 它适用于许多应用程序快捷方式 但是对于 Microsoft Office 应用程序快捷方式它没有提供正确的信息 例如:
在读取 ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\Word 2013.lnk 时
IShellLink::GetPath 返回“C:\Windows\Installer90150000-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;
【问题讨论】:
更多信息:我读到这些被称为广告快捷方式,但仍然不知道如何从这些快捷方式中获取目标信息。 【参考方案1】: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;
【讨论】:
上面还为 Word 2013.lnk 返回相同的路径“C:\Windows\Installer90150000-0011-0000-0000-0000000FF1CE\wordicon.exe” 我用过C++,我试过C++对应的API,已经在帖子中添加了代码,但它不起作用。 @user807688 我在你的代码中没有看到 psl->Resolve(0, SLR_INVOKE_MSI)。以上是关于如何从 Microsoft Office 截图中获取 targetPath、workingDir 信息(例如 Word 2013.lnk)的主要内容,如果未能解决你的问题,请参考以下文章
microsoft office 2019专业增强版激活ID?
如何从 Microsoft Office 2007 中保存 ImageMSO 图标?
应用更新Microsoft Office:WordExcelPowerPoint等
如何从Microsoft Office文档中完全删除那些暴露你身份的元数据?
如何使用 Microsoft Office 12.0 Access Database Engine OLEDB Provider 访问 Excel 文件