私の製品には、関連するすべてのサブ製品をアンインストールするヘルパー実行可能ファイルがあります。すべてのサブ製品のアップグレード コードに基づいてアンインストールします。
まず、 MsiEnumRelatedProducts関数を使用して、アップグレード コードから製品コードをフェッチします。次に、MsiConfigureProductEx関数を使用して製品のアンインストールを試みます。
問題はMsiConfigureProductEx
エラーを返すことです。
呼び出された関数: MsiConfigureProductsEx
リターン コード: 1605 (0x00000645)
説明: このアクションは、現在インストールされている製品に対してのみ有効です。
MsiEnumRelatedProducts
無効な製品コードが返されるのはなぜですか? そのような製品コードが存在するかどうかを確認するために、Windows レジストリを検索しました。ありません。問題をデバッグする方法は?
編集:問題を再現する最小限のコードを追加しました。
// UpgradeCodes is an array having upgrade codes of all modules.
TCHAR lpProductCode[GUID_STR_LENGTH];
const TCHAR tszNoReboot[] = _T("REMOVE=ALL REBOOT=ReallySuppress DISABLE_REBOOT_PROMPT=1");
for (size_t i = 0; i < sizeof(UpgradeCodes) / sizeof(UpgradeCodes[0]); i++)
{
tstring tstrUpgradeCode = UpgradeCodes[i];
DWORD dwIndex = 0;
size_t status;
// for each of the upgrade code, get all the products
do
{
status = MsiEnumRelatedProducts(UpgradeCodes[i],
0,
dwIndex,
lpProductCode);
if (ERROR_SUCCESS == status)
{
UINT uiReturn = MsiConfigureProductEx(lpProductCode,
INSTALLLEVEL_DEFAULT,
INSTALLSTATE_DEFAULT,
tszNoReboot);
if (ERROR_SUCCESS_REBOOT_REQUIRED == uiReturn)
{
// prompt for reboot at the end of all modules uninstallation.
}
if (ERROR_SUCCESS != uiReturn)
{
// log message with return code.
// Error Code: 1605 is coming from here.
}
}
}while (ERROR_NO_MORE_ITEMS != status);
}