MsiGetShortcutTarget MSI LNK文件不返回任何组件ID

时间:2016-01-06 16:54:29

标签: c# wix windows-installer msiexec

我正在尝试以编程方式查找为给定的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文件?

1 个答案:

答案 0 :(得分:0)

如果没有从MsiGetShortcutTarget返回组件ID,则可以从MSI数据库获取组件ID。一种方法是使用WiX DTF,如下所示:https://stackoverflow.com/a/34680682/3051702

然后可以在对MsiGetComponentPath的调用中使用返回的组件ID。或者,可以直接使用本机方法。