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

Разработка универсального приложения на Delphi: доступ к 32-битному и 64-битному реестру через WMI

Delphi , ОС и Железо , Реестр

При разработке приложений на Delphi, особенно тех, которые должны работать как в 32-битной, так и в 64-битной среде, важно учитывать различия в доступе к реестру. В Windows, начиная с версии XP, реестр разделен на 32-битный и 64-битный разделы. Это означает, что 32-битные приложения не имеют прямого доступа к 64-битному реестру и наоборот.

Для универсального доступа к реестру через WMI, необходимо использовать специальные флаги для указания архитектуры провайдера и требуемой архитектуры. В Delphi для этого можно использовать библиотеки, такие как GLibWMI, которые предоставляют удобные инструменты для работы с WMI.

Пример кода для доступа к WMI с указанием архитектуры:

function MyConnectWMI(wmiHost: string; var Services: ISWbemServices): Boolean;
const
  STR_CIM2_ROOT = 'root\CIMV2';
  STR_EMPTY = '';
var
  NVS: SWbemNamedValueSet;
  providerArchitecture: OleVariant;
  requiredArchitecture: OleVariant;
  Locator: ISWbemLocator;
begin
  try
    providerArchitecture := 32; // или 64
    requiredArchitecture := True;

    NVS := CoSWbemNamedValueSet.Create;
    NVS.Add('__ProviderArchitecture', providerArchitecture, 0);
    NVS.Add('__RequiredArchitecture', requiredArchitecture, 0);

    Locator := CoSWbemLocator.Create;
    Services := Locator.ConnectServer(wmiHost, STR_CIM2_ROOT, STR_EMPTY, STR_EMPTY, STR_EMPTY, STR_EMPTY, 0, NVS);

    Result := True;
  except
    Result := False;
  end;
end;

Пример использования стандартного провайдера реестра для чтения значений:

procedure Get_RegistryValue(aIDispatch: IDispatch);
var
  objWMIService: OLEVariant;
  strKeyPath, strValue, strOut: OLEVariant;
  objStdRegProv: OLEVariant;
begin
  objWMIService := aIDispatch;
  objStdRegProv := objWMIService.Get('StdRegProv');

  strKeyPath := 'Software\Microsoft\Wbem\CIMOM';
  strValue := 'Logging';

  objStdRegProv.GetStringValue(HKEY_LOCAL_MACHINE, strKeyPath, strValue, strOut);
  // Здесь можно обработать полученное значение, например, добавить его в список
end;

При работе с WMI и реестром важно помнить, что некоторые классы и методы доступны только в определенных версиях операционной системы и могут требовать специальной обработки исключений.

Комментарий к коду из оригинального сообщения:

Автор сообщения успешно реализовал доступ к реестру, установив параметр providerArchitecture в значение 64. При установке этого параметра в 32, возникала ошибка EOleException с сообщением "Provider Load Fail". Это связано с тем, что некоторые классы WMI предоставляются определенными провайдерами, и для работы с ними необходимо учитывать архитектуру операционной системы.

Заключение:

Для создания универсального приложения на Delphi, которое может работать как с 32-битным, так и с 64-битным реестром, необходимо использовать библиотеки, поддерживающие работу с WMI и указание необходимой архитектуры. Приведенные примеры кода демонстрируют, как это можно сделать, используя Object Pascal.

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

Разработка универсального приложения на Delphi для доступа к 32-битному и 64-битному реестру через WMI требует использования специальных параметров для указания архитектуры, что позволяет работать с реестром в разных битных средах.


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

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




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


:: Главная :: Реестр ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 08:07:42/0.0058369636535645/0