我们正在使用以下函数来获取当前引导配置指定的处理器数量。这个数字纯粹用于记录。
下面的函数在 XP、Vista、7、2003 和 2008 上运行良好。但是,它在 Windows 2012 Server 上失败。
// -1 = not implemented or not allowed
// 0 = not limited
// >0 = number of processors in the {current} boot entry
function Internal_GetBCDNumberOfProcessors: integer;
var
objBcdStore : OleVariant;
objElement : OleVariant;
objWBL : OleVariant;
objWMIService: OleVariant;
begin
// for more info, see: http://stackoverflow.com/questions/7517965/accessing-bcdstore-from-delphi/7527164#7527164
Result := -1;
try
objWMIService := GetObject('winmgmts:{(Backup,Restore)}\\.\root\wmi:BcdStore');
if (not VarIsNull(objWMIService)) and
boolean(objWMIService.OpenStore('', objBcdStore)) and
(not VarIsNull(objBcdStore)) and
boolean(objBcdStore.OpenObject('{fa926493-6f1c-4193-a414-58f0b2456d1e}', objWBL)) and
(not VarIsNull(objWBL))
then
if objWBL.GetElement($25000061, objElement) and //<-- fails here on Server 2012
(not VarIsNull(objElement))
then
Result := StrToIntDef(objElement.Integer, 0)
else
Result := 0;
except
on E: EOleSysError do
Result := -1;
end;
end;
如果我尝试在 Win2012 上运行它,则会objWBL.GetElement
引发EOleSysError
带有 text 的异常OLE error D0000225
。Google 没有找到与此错误代码相关的任何有意义的内容:(
堆栈跟踪表明异常是在 System.Win.ComObj.DispatchInvokeError 中触发的,后者由 VarDispInvoke 调用的 DispatchInvoke 调用。
所有这些都是使用 XE2 复制的。我可以尝试用 XE3 重复这个问题,但我不相信 Delphi RTL 与它有任何关系。
有人知道这种行为的可能原因吗?