我正在尝试以编程方式查找为给定的MSI lnk文件(播发的快捷方式)运行的exe文件。我使用的方法类似于Is there a way to resolve a .lnk target that works for links that end up in c:\windows\installer?的答案中所示的方法。这种方法适用于大多数MSI lnk文件。不幸的是,有少数lnk文件运行正常,但MsiGetShortcutTarget不返回任何组件ID。因此,后续对MsiGetComponentPath的调用将返回InvalidArg。
以下是我使用的代码(取自here):
public const int MaxFeatureLength = 38;
public const int MaxGuidLength = 38;
public const int MaxPathLength = 1024;
public static string ParseShortcut(string shortcutFilename)
{
StringBuilder product = new StringBuilder(MaxGuidLength + 1);
StringBuilder feature = new StringBuilder(MaxFeatureLength + 1);
StringBuilder component = new StringBuilder(MaxGuidLength + 1);
var returnValue = MsiGetShortcutTarget(shortcutFilename, product, feature, component);
if (returnValue != 0)
{
return null;
}
int pathLength = MaxPathLength;
StringBuilder path = new StringBuilder(pathLength);
InstallState installState = MsiGetComponentPath(product.ToString(), component.ToString(), path, ref pathLength);
if (installState == InstallState.Local)
{
return path.ToString();
}
else
{
return null;
}
}
我的机器上的示例是C:\ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Microsoft Office 2013 \ Office 2013 Tools \ Office 2013 Language Preferences.lnk
产品编号:{91150000-0011-0000-0000-0000000FF1CE} 功能ID:SetLanguageFiles
我相信IShellLink接口不能用于返回MSI广告快捷方式的runnable exe,而我尝试这样做会返回包含图标资源的exe的路径。
显然,操作系统可以找到适当的exe(在这种情况下,它是C:\ Program Files(x86)\ Microsoft Office \ Office15 \ SETLANG.EXE)。
如何使用代码获取与此lnk文件关联的exe文件?
答案 0 :(得分:0)
如果没有从MsiGetShortcutTarget返回组件ID,则可以从MSI数据库获取组件ID。一种方法是使用WiX DTF,如下所示:https://stackoverflow.com/a/34680682/3051702。
然后可以在对MsiGetComponentPath的调用中使用返回的组件ID。或者,可以直接使用本机方法。