Главная страница
    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.48 MB
Время: 0.04 c
15-1141061124
grisme
2006-02-27 20:25
2006.03.26
Старая, избитая тема


2-1141668489
vital538
2006-03-06 21:08
2006.03.26
FireBird


15-1141179757
Little)Lamer
2006-03-01 05:22
2006.03.26
проблема с аутпостом


2-1142242532
dabreezy
2006-03-13 12:35
2006.03.26
Удаление дублирующих строк из файла


2-1142155503
Ega23
2006-03-12 12:25
2006.03.26
Сохранить файл в Unicode





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский