1

在一个相对较新的 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);

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

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

所以我能想到的就是这个安装的 Windows 不知何故被破坏了,但我们需要了解 Windows 中具体错误的根本原因。谁能给我指导;即使只是某些调查途径?

4

1 回答 1

0

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

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

于 2012-05-31T04:57:25.980 回答