![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RegQueryValueEx
DillerXX © (2005-11-22 21:10:00)Написал неправильный код для работы с реестром, работает он только в самой программе, а в длл нет.
{$APPTYPE CONSOLE}
uses Windows;
var ddSize:PDWORD;
s:string;
key:HKEY;
begin
SetLength(s,1024);
// new(ddSize);
RegOpenKey(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion',Key);
RegQueryValueEx(Key, 'WallPaperDir', nil, nil, pbyte(s), ddSize);
delete(s,ddSize^,length(s)-ddSize^+1);
writeln(s);
readln;
end.
Если раскомментировать строчку new(ddSize) то ошибки в длл выдаваться не будет, но тогда будет возвращаться пустая строка. Помогите, какой код будет правильным?
umbra (2005-11-22 21:27:00) [1]var ddSize:PDWORD;
s:string;
key:HKEY;
begin
SetLength(s,1024);
new(ddSize);
ddSize^ := 1024; RegOpenKey(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion',Key);
RegQueryValueEx(Key, 'WallPaperDir', nil, nil, pbyte(s), ddSize);
delete(s,ddSize^,length(s)-ddSize^+1);
writeln(s);
readln;
end.
umbra (2005-11-22 21:25:00) [2]
> ddSize:PDWORD;
Это указатель, и значит перед тем, как передать его в функцию, ему надо присвоить адрес чего-то (точнее - адрес переменной, содержащей длину записываемой информации). У Вас эта переменная не инициализируется нигде.
> // new(ddSize);
Это выражение выделяет память под DWORD, заполняет ее нулями и присваивает ее адрес переменнойddSize. Поэтому если его раскомментировать, тоRegQueryValueExвернет пустую строку, поскольку просили 0 байт