【发布时间】:2026-01-05 09:20:03
【问题描述】:
我正在尝试编写一个 AutoIt 脚本来卸载具有特定 Upgrade Code 的所有 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)
这可以完美地确定第一个安装产品的产品代码,但是一旦 iProductIndex 增加到 1,它就会返回 87 (ERROR_INVALID_PARAMETER)。通常在 the input GUID is malformed 时会返回此错误,但如果是这种情况,它也不应该与 iProductIndex = 0 一起使用...
我对这段代码的期望(当安装了 2 个具有相同升级代码的软件包时)是:
- 打印“0 ”
- 打印“0 ”
- 打印“259”(ERROR_NO_MORE_ITEMS)
目前在做什么:
- 打印“0 ”
- 打印“87”(ERROR_INVALID_PARAMETER)
有什么想法吗?
(如果您想在自己的计算机上测试此代码,则需要安装两个具有相同 UpgradeCode 的 MSI 包。这是我的 WiX 测试包:http://pastie.org/3022676)
【问题讨论】:
标签: autoit