Я хочу разрешить объявленный ярлык MSI в c #, как описано здесь:
Как разобрать "специальные" .lnk файлы, иначе. Ярлыки MSI ака. Установщик Windows объявил ярлыки с использованием C #
[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);
...
}
Я использую VS 2010 и пробовал с разными настройками для "Цель платформы" и / или "Структура цели". MsiGetShortcutTarget всегда возвращает 1603 (фатальная ошибка во время установки) в Windows 7.
Я пытался сделать то же самое с c ++, и я могу разрешить ярлык, и все в порядке. Я также проверил с msi.dll, что я скопировал из Windows XP, и эта DLL может разрешить ярлык с кодом C #. Я понятия не имею, почему код c # не будет работать с msi.dll под Windows 7.
Я тестирую MsiGetComponentPath с известным GUID продукта и GUID компонента, чтобы разрешить целевой путь в c # с помощью dll, который возвращает 1603 для MsiGetShortcutTarget и работает отлично. Поэтому в Windows 7 происходит сбой только MsiGetComponentPath, и я не знаю, почему это пошло не так.