在一个相对较新的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中特别错误的根本原因。谁能给我指导;即使只是某些途径需要调查?
答案 0 :(得分:0)
以下是我解决这个问题的方法:
我使用SysInternals的ProcessMonitor来看看它在幕后做了什么(将其与在实际工作的机器上使用ProcessMonitor进行比较)。我注意到不同之处在于,只要它在HKCR / Installer / Products中查看,就会开始捆绑该过程(而在工作PC上,它会继续从注册表中获取安装程序信息)。事实证明,那里存在一个格式错误的产品代码(某种程度上是一个连字符),因此功能失败了。不知道它是怎么到达的,但你去了。