Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
2-1142244040
Arkady
2006-03-13 13:00
2006.03.26
TBlobField


2-1142181698
zaN0za
2006-03-12 19:41
2006.03.26
Сравнение типов


2-1142240102
gidd
2006-03-13 11:55
2006.03.26
получени почты


2-1142331451
xroot
2006-03-14 13:17
2006.03.26
Обращение к параметру TADOQuery


2-1141629214
Bratskiy
2006-03-06 10:13
2006.03.26
Выравнивание Label





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский