在一个相对较新的 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
,szSid
并context
保持numChars
不变;通过实际给它们虚拟值并查看它们没有被覆盖来进行测试。此外,result
设置为 234;这通常表明szSid
缓冲区太小,我需要传入更大的缓冲区;numChars
变量应该用这个大小填充。但是,如前所述,numChars 与之前 (40) 完全相同,因此以相同的大小(加上一个用于空终止)再次调用该方法与第一次没有什么不同。
当我在其他机器上运行相同的代码时,它的行为与文档所说的完全一样——填充所有变量,包括szSid
其缓冲区长度;如果缓冲区太小,则返回ERROR_MORE_DATA
并填充numChars
适当的大小。
所以我能想到的就是这个安装的 Windows 不知何故被破坏了,但我们需要了解 Windows 中具体错误的根本原因。谁能给我指导;即使只是某些调查途径?