![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RegSetValueEx. Как из HKEY выудить полное имя ключа в реестре?
The One © (2005-10-30 17:47:00)function RegSetValueEx(
hKey: HKEY; // handle of key to set value for
... )
Собственно, проблемма в том как же получить в переменную типа string полное имя ключа, зная его хендл?
Rooter (2006-01-09 23:36:00) [1]Вот пишу код, приведенный в [7] в процедуре в dll
На строчкеGetMem(Info, Len)выпадает исключение: EOutOfMemory
В чем дело и как с этим бороться?
begin...end (2005-12-13 21:20:00) [2]> VirEx © (13.12.05 17:33) [11]
> ShowMessage(PChar(Name))
Ну да, ну да. Name -- последовательность двухбайтовых НЕнулевых буковок. А приведение к типу PChar каким-то волшебным образом определит, где у этой последовательности конец.
А в [7] можно было проще (без создания новой строки) сделать -- сразу выделить для записи Info на 2 байта больше (благо, Name -- это последнее поле записи), заполнить её вызовом ZwQueryKey и записать в конец двойной нолик.
VirEx (2005-12-13 17:33:00) [3]
> Строка Info.Name -- это unicode-строка, НЕ завершающаяся
> нулём.
ShowMessage(PChar(Name)), или Name:=Name#0, или Name:=PChar(Name+#0)
savl (2005-12-13 17:21:00) [4]begin...end премного благодарен
The One (2005-10-31 22:54:00) [5]Спасибо за содействие )
Завтра займусь разбором, сейчас уже действительно поздно.
begin...end (2005-10-31 22:20:00) [6]Поясню вот эти строки из [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-строка, НЕ завершающаяся нулём. Мне ничего другого не пришло в голову, кроме как выделить ещё один буфер (побольше), скопировать туда тело этой строки и завершить её нулём.
begin...end (2005-10-31 22:15:00) [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.
В коде мог ошибиться -- уже поздно :-)
The One (2005-10-31 20:32:00) [8]Экспортировать класс из dll вроде бы нельзя, тогда как быть?
The One (2005-10-31 20:27:00) [9]С Си у мну проблеммы, тем не менее, как я понимаю в Си есть некий модуль 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, как это можно сделать?
begin...end (2005-10-31 19:29:00) [10]> 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-30 18:50:00) [11]Да ZwQueryKey - то, что надо, спасибо.
Вот только проблемма, какой модуль необходимо присоеденить, дабы успешно использовать функцию? Или импортировать из dll, тогда из какой и если можно в кратце - как? )
begin...end (2005-10-30 18:29:00) [12]> The One © (30.10.05 17:47)
Для NT-систем это возможно. См. в MSDN описание функции ZwQueryKey.
Anatoly Podgoretsky (2005-10-30 18:16:00) [13]Никак, это же цифровой идентификатор раздела.