Главная страница
    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.039 c
2-1141979103
Гость111
2006-03-10 11:25
2006.03.26
Как запустить windows-кий калькулятор из программы.


3-1138702466
Huk
2006-01-31 13:14
2006.03.26
ClientDataSet


15-1141655767
nightwalker
2006-03-06 17:36
2006.03.26
VB.NET vs. Delphi


15-1141138547
Nick Denry
2006-02-28 17:55
2006.03.26
"СЕТЕЦЕНТРИЧНАЯ ВОЙНА": ИСТОКИ И ТЕХНИЧЕСКИЕ АСПЕКТЫ


15-1141233568
Piter
2006-03-01 20:19
2006.03.26
Радио-интернет и телефония





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