c # dllimport MsiGetShortcutTarget (msi.dll) не удалось с ошибкой 1603 под Windows 7 - PullRequest
0 голосов
/ 20 декабря 2010

Я хочу разрешить объявленный ярлык 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, и я не знаю, почему это пошло не так.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2010

Я настоятельно рекомендую взглянуть на WiX Deployment Tools Foundation. Он имеет действительно хорошую библиотеку взаимодействия, разработанную сотрудником MSFT, которая делает вызов MSI простым.

Например, пространство имен Microsoft.Deployment.WindowsInstaller имеет класс Installer, который предоставляет статический метод ShortcutTarget GetShortcutTarget (ярлык строки). Класс ShortcutTarget затем получает методы доступа для ComponentCode, Feature и ProductCode.

Additionalyl - это проект с открытым исходным кодом, поэтому, если вы действительно хотите знать, как работает P / Invoke, вы можете посмотреть код.

0 голосов
/ 20 декабря 2010

Это похоже на способ инициализации COM.

Если я добавлю [STAThread] к моему Main методу, он работает нормально (хорошо, если вы фактически используете StringBuilder вместо char[] в качестве аргументов :-), но я получаю возвращаемое значение 1603, когда используя MTA.

...