MsiEnumProductsEx返回ERROR_MORE_DATA而不做任何事情

时间:2012-05-31 01:26:58

标签: windows-installer

在一个相对较新的XP(SP3)安装中,调用MsiEnumProductsEx(来自msi.lib)会得到奇怪的结果。这是我的代码:

    TCHAR userId[8] = _T("s-1-1-0");
    UINT result;
    index = 0;
    TCHAR szInstalledProductCode[39];
    TCHAR szSid[40];
    MSIINSTALLCONTEXT context;
    DWORD numChars = 40;
    MSIINSTALLCONTEXT context;
    result = MsiEnumProductsEx(NULL, userId, MSIINSTALLCONTEXT_ALL, index, szInstalledProductCode, &context, (LPTSTR)szSid, &numChars);

在此函数调用之后,所有输出变量保持不变;也就是说,szInstalledProductCodeszSidcontextnumChars保持不变;通过实际给它们虚拟值并看到它们没有被覆盖来测试。此外,result设置为234;这通常表明szSid缓冲区太小,我需要传入更大的缓冲区; numChars变量应填充此大小。但是,如前所述,numChars与之前(40)完全一样,因此再次使用相同的大小调用该方法(加上一个用于空终止)与第一次没有任何不同。

当我在其他机器上运行相同的代码时,它的行为与文档说它应该表现的完全相同 - 填充所有变量,包括szSid到其缓冲区长度;如果缓冲区太小,则返回ERROR_MORE_DATA并以适当的大小填充numChars

所以我能想到的是,Windows的这种安装在某种程度上被破坏了,但我们需要了解Windows中特别错误的根本原因。谁能给我指导;即使只是某些途径需要调查?

1 个答案:

答案 0 :(得分:0)

以下是我解决这个问题的方法:

我使用SysInternals的ProcessMonitor来看看它在幕后做了什么(将其与在实际工作的机器上使用ProcessMonitor进行比较)。我注意到不同之处在于,只要它在HKCR / Installer / Products中查看,就会开始捆绑该过程(而在工作PC上,它会继续从注册表中获取安装程序信息)。事实证明,那里存在一个格式错误的产品代码(某种程度上是一个连字符),因此功能失败了。不知道它是怎么到达的,但你去了。