Форум: "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.044 c