Вопрос, заданный пользователем, касается проблемы, с которой он столкнулся при попытке использования функции для получения количества процессоров, указанных в текущей конфигурации загрузки, на Windows Server 2012. Функция успешно работала на более ранних версиях Windows, включая XP, Vista, 7, 2003 и 2008, но на Windows Server 2012 она вызывала исключение EOleSysError с кодом ошибки OLE D0000225.
Проблема и описание функции
Функция Internal_GetBCDNumberOfProcessors предназначена для получения количества процессоров, используемых по текущей конфигурации загрузки, и используется исключительно для логирования. В коде функции используется объектная модель WMI для работы с BCDStore. При вызове метода GetElement на Windows Server 2012 происходит ошибка.
function Internal_GetBCDNumberOfProcessors: integer;
var
objBcdStore, objElement, objWBL, objWMIService: OleVariant;
begin
// ... код функции ...
if objWBL.GetElement($25000061, objElement) then
// ... обработка результата ...
end;
Анализ проблемы
Исключение EOleSysError с кодом D0000225 указывает на проблему, связанную с работой с OLE. В контексте данной функции это может быть связано с изменениями в объектной модели WMI, внесёнными в Windows Server 2012. В комментариях к вопросу упоминается, что ошибка может быть связана с компонентами обновления Windows.
Подтверждённый ответ
В качестве решения предлагается использовать метод EnumerateElements вместо GetElement, который не вызывает исключение, но также не находит элемент NumberOfProcessors. Это может быть связано с тем, что структура BCDStore изменилась, и элемент NumberOfProcessors теперь имеет другой тип или идентификатор.
if objWBL.EnumerateElements(objArray) then try
for i := VarArrayLowBound(objArray, 1) to VarArrayHighBound(objArray, 1) do begin
objElement := objArray[i];
if objElement.Type = $25000061 then
Exit(objElement.Integer);
end;
finally
VarClear(objArray);
end;
Альтернативные шаги
Убедитесь, что у вас установлены все последние обновления Windows Server 2012, включая обновление 4 hotfix 1.
Проверьте, включен ли UAC, и запускайте приложение как администратор.
Попробуйте использовать VBScript для получения описания ошибки, как предложено в комментариях.
Рассмотрите возможность обновления вашего компилятора Delphi до последней версии, чтобы исключить возможные проблемы с RTL.
Заключение
Изменения в объектной модели WMI, внесённые в Windows Server 2012, могут быть причиной проблемы. Рекомендуется пересмотреть подход к работе с BCDStore, возможно, с использованием альтернативных методов, таких как EnumerateElements. Также важно обеспечить, что ваша система обновлена, и использовать актуальные версии программного обеспечения для разработки.
Пользователь столкнулся с проблемой в функционировании функции подсчета процессоров на операционной системе Windows Server 2012, которая ранее работала корректно на более старых версиях Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.