Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему функция подсчёта процессоров перестаёт работать на Windows Server 2012

Delphi , ОС и Железо , Windows

Вопрос, заданный пользователем, касается проблемы, с которой он столкнулся при попытке использования функции для получения количества процессоров, указанных в текущей конфигурации загрузки, на 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;

Альтернативные шаги

  1. Убедитесь, что у вас установлены все последние обновления Windows Server 2012, включая обновление 4 hotfix 1.
  2. Проверьте, включен ли UAC, и запускайте приложение как администратор.
  3. Попробуйте использовать VBScript для получения описания ошибки, как предложено в комментариях.
  4. Рассмотрите возможность обновления вашего компилятора Delphi до последней версии, чтобы исключить возможные проблемы с RTL.

Заключение

Изменения в объектной модели WMI, внесённые в Windows Server 2012, могут быть причиной проблемы. Рекомендуется пересмотреть подход к работе с BCDStore, возможно, с использованием альтернативных методов, таких как EnumerateElements. Также важно обеспечить, что ваша система обновлена, и использовать актуальные версии программного обеспечения для разработки.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой в функционировании функции подсчета процессоров на операционной системе Windows Server 2012, которая ранее работала корректно на более старых версиях Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-26 19:51:57/0.0031540393829346/0