MsiGetShortcutTarget(msi.dll)的c#dllimport在Windows 7下失败,错误为1603

MsiGetShortcutTarget(msi.dll)的c#dllimport在Windows 7下失败,错误为1603,c#,windows-installer,dllimport,C#,Windows Installer,Dllimport,我想解析c#中公布的MSI快捷方式,如下所述: 我使用VS2010并尝试了“平台目标”和/或“目标框架”的不同设置。MsiGetShortcutTarget在Windows 7下始终返回1603(安装期间发生致命错误) 我尝试用C++做同样的事情,我可以解决捷径,一切都很好。我还测试了一个msi.dll,它是我从WindowsXP复制的,这个dll可以用C代码解析快捷方式。我不知道为什么c代码不能在Windows7下与msi.dll一起工作 我使用已知的产品GUID和组件GUID测试了MsiG

我想解析c#中公布的MSI快捷方式,如下所述:

我使用VS2010并尝试了“平台目标”和/或“目标框架”的不同设置。MsiGetShortcutTarget在Windows 7下始终返回1603(安装期间发生致命错误)

我尝试用C++做同样的事情,我可以解决捷径,一切都很好。我还测试了一个msi.dll,它是我从WindowsXP复制的,这个dll可以用C代码解析快捷方式。我不知道为什么c代码不能在Windows7下与msi.dll一起工作


我使用已知的产品GUID和组件GUID测试了MsiGetComponentPath,以解析c#中的目标路径,并使用dll,该dll为MsiGetShortcutTarget返回1603,并且工作正常。因此,在Windows 7下,只有MsiGetComponentPath出现故障,我不知道为什么会出错。

这似乎与COM的初始化方式有关


如果我把代码> [StTyth][/COD]添加到我的<代码>主< /代码>方法中,它工作得很好(如果你实际使用<代码> StringBuilder <代码>而不是你的代码> char []/COM>用于你的参数:-但是,当使用MTA时,我得到的返回值为1603。

< P>我强烈建议查看WIX的部署工具基础。它有一个由MSFT员工开发的非常好的互操作库,使得调用MSI变得非常容易

例如,Microsoft.Deployment.WindowsInstaller命名空间具有一个安装程序类,该类公开静态方法ShortcutTarget GetShortcutTarget(字符串快捷方式)。然后,ShortcutTarget类具有ComponentCode、Feature和ProductCode的get访问器


另外,这是一个开源项目,所以如果你真的,真的想知道p/Invoke是如何工作的,你可以看看代码

char[]只是另一个测试,应该是StringBuilder,没错。
[DllImport("msi.dll", CharSet = CharSet.Auto)]
private static extern UInt32 MsiGetShortcutTarget(
    string szShortcutTarget,
    [Out] StringBuilder szProductCode,
    [Out] StringBuilder szFeatureId,
    [Out] StringBuilder szComponentCode);

public static string ParseShortcut(string file)
{
    StringBuilder product = new StringBuilder(MaxGuidLength + 1);
    StringBuilder feature = new StringBuilder(MaxFeatureLength + 1);
    StringBuilder component = new StringBuilder(MaxGuidLength + 1);

    UInt32 res = MsiGetShortcutTarget(file, product, feature, component);
    ...
}