Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

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

 
The One ©   (2005-10-30 17:47) [0]

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

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


 
Anatoly Podgoretsky ©   (2005-10-30 18:16) [1]

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


 
begin...end ©   (2005-10-30 18:29) [2]

> The One ©   (30.10.05 17:47)

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


 
The One ©   (2005-10-30 18:50) [3]

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


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

> 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-31 20:27) [5]

С Си у мну проблеммы, тем не менее, как я понимаю в Си есть некий модуль 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, как это можно сделать?


 
The One ©   (2005-10-31 20:32) [6]

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


 
begin...end ©   (2005-10-31 22:15) [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.


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


 
begin...end ©   (2005-10-31 22:20) [8]

Поясню вот эти строки из [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-строка, НЕ завершающаяся нулём. Мне ничего другого не пришло в голову, кроме как выделить ещё один буфер (побольше), скопировать туда тело этой строки и завершить её нулём.


 
The One ©   (2005-10-31 22:54) [9]

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


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

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


 
VirEx ©   (2005-12-13 17:33) [11]


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

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


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

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

> ShowMessage(PChar(Name))

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
3-1138719392
Ega23
2006-01-31 17:56
2006.03.26
Refresh TClientDataSet по Master-Detail связке


2-1141897963
DelphiN!
2006-03-09 12:52
2006.03.26
Перевод массива ASCLL кодов в их символьное представление


15-1141542951
grisme
2006-03-05 10:15
2006.03.26
JAVA - скрипт


2-1142065880
AlexeyT
2006-03-11 11:31
2006.03.26
Число отображаемых строк в TMemo


2-1141914459
oleg__
2006-03-09 17:27
2006.03.26
TRxFolderMonitor