Windows installer MsiEnumProductsEx返回错误\u更多\u数据而不执行任何操作

Windows installer MsiEnumProductsEx返回错误\u更多\u数据而不执行任何操作,windows-installer,Windows Installer,在一个相对较新的XP SP3安装中,我从msi.lib调用MsiEnumProductsEx得到了奇怪的结果。这是我的密码: TCHAR userId[8] = _T("s-1-1-0"); UINT result; index = 0; TCHAR szInstalledProductCode[39]; TCHAR szSid[40]; MSIINSTALLCONTEXT context; DWORD numChars = 40;

在一个相对较新的XP SP3安装中,我从msi.lib调用MsiEnumProductsEx得到了奇怪的结果。这是我的密码:

    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保持不变;通过实际给它们虚拟值并确保它们没有被覆盖来进行测试。此外,结果被设置为234;这通常表示szSid缓冲区太小,需要传入更大的缓冲区;numChars变量应填充此大小。但是,正如前面提到的,numChars与40之前完全相同,因此再次调用相同大小加1的方法以进行null终止与第一次没有什么不同

当我在其他机器上运行相同的代码时,它的行为与文档中所说的完全相同——填充所有变量,包括szSid,直到其缓冲区长度;如果缓冲区太小,则返回更多错误数据,并用适当的大小填充numChars


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

以下是我如何解决这个问题的:


我使用SysInternals中的ProcessMonitor查看它在幕后做了什么,并将其与在实际工作的机器上使用ProcessMonitor进行了比较。我注意到不同之处在于,它一查看HKCR/Installer/Products,就开始占用流程,而在工作PC上,它接着从注册表获取安装程序信息。结果是,有一个格式错误的产品代码,不知怎的,在它的开头有一个连字符,所以函数失败了。不知道它是如何到达那里的,但你已经做到了。

相似但不同的奇怪事情: