Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RegSetValueEx. Как из HKEY выудить полное имя ключа в реестре?


The One ©   (2005-10-30 17:47:00) 

function RegSetValueEx(
  hKey: HKEY; // handle of key to set value for
  ... )

Собственно, проблемма в том как же получить в переменную типа string полное имя ключа, зная его хендл?


Rooter   (2006-01-09 23:36:00) [1]

Вот пишу код, приведенный в [7] в процедуре в dll
На строчке GetMem(Info, Len)выпадает исключение: EOutOfMemory
В чем дело и как с этим бороться?


begin...end   (2005-12-13 21:20:00) [2]

> VirEx ©   (13.12.05 17:33) [11]

> ShowMessage(PChar(Name))

Ну да, ну да. Name -- последовательность двухбайтовых НЕнулевых буковок. А приведение к типу PChar каким-то волшебным образом определит, где у этой последовательности конец.

А в [7] можно было проще (без создания новой строки) сделать -- сразу выделить для записи Info на 2 байта больше (благо, Name -- это последнее поле записи), заполнить её вызовом ZwQueryKey и записать в конец двойной нолик.


VirEx   (2005-12-13 17:33:00) [3]


> Строка Info.Name -- это unicode-строка, НЕ завершающаяся
> нулём.

ShowMessage(PChar(Name)), или Name:=Name#0, или Name:=PChar(Name+#0)


savl   (2005-12-13 17:21:00) [4]

begin...end премного благодарен


The One   (2005-10-31 22:54:00) [5]

Спасибо за содействие )
Завтра займусь разбором, сейчас уже действительно поздно.


begin...end   (2005-10-31 22:20:00) [6]

Поясню вот эти строки из [7]:

> GetMem(Name, Info.NameLength + 2);
>  try
>    Move(Info.Name, Name^, Info.NameLength);
>    Name[Info.NameLength div 2] := #0;
>    ShowMessage(Name)
>  finally
>    FreeMem(Name)
>  end

Строка Info.Name -- это unicode-строка, НЕ завершающаяся нулём. Мне ничего другого не пришло в голову, кроме как выделить ещё один буфер (побольше), скопировать туда тело этой строки и завершить её нулём.


begin...end   (2005-10-31 22:15:00) [7]

> The One ©   (31.10.05 20:27) [5]

> нужно экспортировать класс

KEY_INFORMATION_CLASS -- это не класс. Это enum, т.е. перечислимый тип.

>  заменить чем-нибудь PVoid

PVOID, в переводе на Паскаль -- это нетипизированый указатель, т.е. Pointer.

> The One ©   (31.10.05 20:32) [6]

> Экспортировать класс из dll вроде бы нельзя, тогда как быть?

Т.к. экспортировать тип из dll действительно нельзя, то остаётся одно -- описать его самостоятельно, т.е. перевести его сишное описание (взятое из MSDN) на Delphi.

Вот пример на Delphi, составленный на основе MSDN и кода примера по ссылке в [4]:

type
 NTSTATUS = Integer;
 KEY_INFORMATION_CLASS = (KeyBasicInformation, KeyNodeInformation, KeyFullInformation, KeyNameInformation);
 PKEY_NAME_INFORMATION = ^KEY_NAME_INFORMATION;
 KEY_NAME_INFORMATION = packed record
   NameLength: Cardinal;
   Name:       WideChar;
 end;

function ZwQueryKey(
 KeyHandle: HKEY;
 KeyInformationClass: KEY_INFORMATION_CLASS;
 KeyInformation: Pointer;
 Length: Cardinal;
 ResultLength: PCardinal): NTSTATUS; stdcall; external 'ntdll.dll';

var
 Key: HKEY;
 Len: Cardinal;
 Info: PKEY_NAME_INFORMATION;
 Name: PWideChar;
begin
 RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion', 0, KEY_QUERY_VALUE, Key);
 ZwQueryKey(Key, KeyNameInformation, nil, 0, @Len);
 GetMem(Info, Len);
 try
   if ZwQueryKey(Key, KeyNameInformation, Info, Len, @Len) = 0 then
   begin
     GetMem(Name, Info.NameLength + 2);
     try
       Move(Info.Name, Name^, Info.NameLength);
       Name[Info.NameLength div 2] := #0;
       ShowMessage(Name)
     finally
       FreeMem(Name)
     end
   end
 finally
   FreeMem(Info)
 end;
 RegCloseKey(Key)
end.


В коде мог ошибиться -- уже поздно :-)


The One   (2005-10-31 20:32:00) [8]

Экспортировать класс из dll вроде бы нельзя, тогда как быть?


The One   (2005-10-31 20:27:00) [9]

С Си у мну проблеммы, тем не менее, как я понимаю в Си есть некий модуль ntddk.h в котором уже описанна функция и необходимые классы, в том числе необходимый нам KEY_INFORMATION_CLASS вокруг этого модуля собственно все и вертиться в приведенном примере, есть ли аналогичный модуль для Delphi?

........
я пробую сделать следующее:
function ZwQueryKey(KeyHandle:HKEY;KeyInformationClass:KEY_INFORMATION_CLASS;KeyInformation:PVOID;Length:ULONG;ResultLength:PULON G):dword {??? здесь не совсем понятный NTSTATUS};stdcall;external 'ntdll.dll';

Ругается на Key_Information_Class и на PVoid, вывод - нужно экспортировать класс и может быть заменить чем-нибудь PVoid, как это можно сделать?


begin...end   (2005-10-31 19:29:00) [10]

> The One ©   (30.10.05 18:50) [3]

> Или импортировать из dll, тогда из какой

ntdll.dll

Пример использования на С: http://groups.google.ru/group/microsoft.public.platformsdk.base/msg/6f6380f226e96f21


The One   (2005-10-30 18:50:00) [11]

Да ZwQueryKey - то, что надо, спасибо.
Вот только проблемма, какой модуль необходимо присоеденить, дабы успешно использовать функцию? Или импортировать из dll, тогда из какой и если можно в кратце - как? )


begin...end   (2005-10-30 18:29:00) [12]

> The One ©   (30.10.05 17:47)

Для NT-систем это возможно. См. в MSDN описание функции ZwQueryKey.


Anatoly Podgoretsky   (2005-10-30 18:16:00) [13]

Никак, это же цифровой идентификатор раздела.


Наверх

Титульная страница Поиск, карта сайта Написать письмо