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

Решение проблемы чтения ключей CLSID в реестре Windows для 32-битных приложений на 64-битной системе в Delphi

Delphi , Синтаксис , Справочник по API-функциям

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

Проблема с чтением ключей CLSID

При попытке прочитать значения по ключам CLSID с помощью Delphi-приложения может возникнуть исключение "Invalid data type for ''", если приложение работает в 32-битном режиме на 64-битной системе. Это связано с тем, что ключи могут быть переадресованы WOW64 в специальный раздел реестра, предназначенный для 32-битных приложений.

Пример кода

Допустим, у нас есть следующий код на Object Pascal, который пытается прочитать все ключи CLSID:

procedure TForm2.Button1Click(Sender: TObject);
var
  guid: string;
  reg: TRegistry;
  sl: TStringList;
  i: Integer;
  name: string;
begin
  memo1.Clear;

  reg := TRegistry.Create;
  sl := TStringList.Create;
  memo1.Lines.BeginUpdate;
  try
    reg.RootKey := HKEY_CLASSES_ROOT;
    if reg.OpenKeyReadOnly('\CLSID\') then
    begin
      reg.GetKeyNames(sl);
      reg.CloseKey;

      for i := 0 to sl.Count-1 do // Исправлено на 0
      begin
        guid := sl.Strings[i];

        if reg.OpenKeyReadOnly('\CLSID\' + guid) then
        begin
          try
            name := reg.ReadString('');
          except
            name := '!!! <ERROR1> !!!';
          end;
          reg.CloseKey;
        end;

        memo1.Lines.Add(guid + ' ' + name);
      end;
    end;
  finally
    sl.Free;
    reg.Free;
    memo1.Lines.EndUpdate;
  end;
end;

Решение проблемы

Чтобы решить проблему, необходимо учитывать, что ключи CLSID могут быть переадресованы в раздел HKCR\Wow6432Node\CLSID для 32-битных приложений. Следовательно, для чтения таких ключей необходимо обращаться именно к этому разделу.

Также стоит заметить, что тип данных по умолчанию для некоторых ключей CLSID может быть не REG_SZ (строка), а другой, например, REG_BINARY. Для обработки различных типов данных следует использовать метод GetDataAsString или аналогичные функции.

Пример с использованием WOW64

Для чтения ключей из 64-битного представления реестра в 32-битном приложении можно использовать флаг KEY_WOW64_64KEY. Вот как может выглядеть исправленный код:

procedure TForm2.Button1Click(Sender: TObject);
var
  guid, name: string;
  reg: TRegistry;
  sl: TStringList;
  i: Integer;
  flags: DWORD;
begin
  memo1.Clear;

  reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
  sl := TRegistryStringList.Create;
  memo1.Lines.BeginUpdate;
  try
    reg.RootKey := HKEY_CLASSES_ROOT;
    if reg.OpenKeyReadOnly('\CLSID\') then
    begin
      reg.GetKeyNames(sl);
      reg.CloseKey;

      for i := 0 to sl.Count-1 do
      begin
        guid := sl.Strings[i];

        if reg.OpenKeyReadOnly('\CLSID\' + guid) then
        begin
          try
            name := reg.ReadString('');
          except
            name := reg.GetDataAsString('');
          end;
          reg.CloseKey;
        end;

        memo1.Lines.Add(guid + ' ' + name);
      end;
    end;
  finally
    sl.Free;
    reg.Free;
    memo1.Lines.EndUpdate;
  end;
end;

В этом примере мы создаем экземпляр TRegistry с флагом KEY_WOW64_64KEY, что позволяет работать с 64-битным представлением реестра. Мы также используем метод GetDataAsString для корректного чтения данных независимо от их типа.

Заключение

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

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

Проблема чтения ключей CLSID в реестре Windows для 32-битных приложений на 64-битной системе в среде Delphi.


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

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




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


:: Главная :: Справочник по API-функциям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 18:59:50/0.0036101341247559/0