Я пытаюсь написать сценарий AutoIt, который удаляет все пакеты MSI с определенным Код обновления. Это мой код до сих пор:
$i = 0
Do
$buffer = DllStructCreate("wchar[39]")
$ret = DllCall("msi.dll", "UINT", "MsiEnumRelatedProductsW", _
"wstr", "{a1b6bfda-45b6-43cc-88de-d9d29dcafdca}", _ ; lpUpgradeCode
"dword", 0, _ ; dwReserved
"dword", $i, _ ; iProductIndex
"ptr", DllStructGetPtr($buffer)) ; lpProductBuf
$i = $i + 1
MsgBox(0, "", $ret[0] & " " & DllStructGetData($buffer, 1))
Until($ret[0] <> 0)
Это работает безупречно, чтобы определить код продукта для первого установленного продукта, но возвращает 87 (ERROR_INVALID_PARAMETER), как только iProductIndex увеличивается до 1. Обычно эта ошибка возвращается, когда входной идентификатор GUID имеет неверный формат, но в этом случае он также не должен работать с iProductIndex = 0...
Что я ожидал от этого кода (когда установлены 2 пакета с одинаковым кодом обновления):
- Выведите «0 ‹первый код продукта›»
- Выведите «0 ‹второй код продукта›»
- Вывести "259" (ERROR_NO_MORE_ITEMS)
Что он делает в настоящее время:
- Выведите «0 ‹первый код продукта›»
- Вывести "87" (ERROR_INVALID_PARAMETER)
Любые идеи?
(Если вы хотите протестировать этот код на своем компьютере, вам понадобятся два пакета MSI с одним и тем же установленным UpgradeCode. Вот мои тестовые пакеты WiX: http://pastie.org/3022676 )