Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RegQueryValueEx. Помогите!


Mazenrat ©   (2002-09-24 15:42:00) 

Доброго времени суток.

Люди!!! Помоги разобраться, почему не работает моя конструкция. Проблема в том, что есть значение или нет - всё-равно выдаётся сообщение "Значение есть".

function ExistsPlayCD(const ValueName: string):Boolean;
var
Key : HKey;
begin
ifRegOpenKeyEx(HKEY_CLASSES_ROOT, "AudioCD\shell\Play\Command", 0, KEY_QUERY_VALUE, Key) = ERROR_SUCCESS then
try
Result := RegQueryValueEx(Key, nil, PChar( ValueName), nil, nil, nil) = ERROR_SUCCESS;
finally
RegCloseKey(Key);
end else
Result := False;
end;

ifExistsPlayCD("PlayCD") then
MessageBox(0,"Значение есть","",MB_OK)
else
MessageBox(0,"Нет","",MB_OK);


Sonic   (2002-09-24 22:59:00) [1]

Если ответить в двух словах то надо
заменить строку

Result := RegQueryValueEx(Key, nil, PChar(ValueName), nil, nil, nil) = ERROR_SUCCESS;

на

Result := RegQueryValueEx(Key, PChar(ValueName), nil, nil, nil, nil) = ERROR_SUCCESS;

должно работать.


Romkin   (2002-09-24 17:54:00) [2]

Достаточно посмотреть исходник TRegistry

function TRegistry.GetDataInfo(const ValueName: string; var Value: TRegDataInfo): Boolean;
var
DataType: Integer;
begin
FillChar(Value, SizeOf(TRegDataInfo), 0);
Result := RegQueryValueEx(CurrentKey, PChar(ValueName), nil, @DataType, nil,
@Value.DataSize) = ERROR_SUCCESS;
Value.RegData := DataTypeToRegData(DataType);
end;

function TRegistry.GetDataSize(const ValueName: string): Integer;
var
Info: TRegDataInfo;
begin
if GetDataInfo(ValueName, Info) then
Result := Info.DataSize else
Result := -1;
end;

function TRegistry.GetData(const Name: string; Buffer: Pointer;
BufSize: Integer; var RegData: TRegDataType): Integer;
var
DataType: Integer;
begin
DataType := REG_NONE;

if RegQueryValueEx(CurrentKey, PChar(Name), nil, @DataType, PByte(Buffer),
@BufSize) <> ERROR_SUCCESS then

raise ERegistryException.CreateResFmt(@SRegGetDataFailed, [Name]);
Result := BufSize;
RegData := DataTypeToRegData(DataType);
end;

function TRegistry.ReadString(const Name: string): string;
var
Len: Integer;
RegData: TRegDataType;
begin
Len := GetDataSize(Name);
if Len > 0 then
begin
SetString(Result, nil, Len);
GetData(Name, PChar(Result), Len, RegData);
if (RegData = rdString) or (RegData = rdExpandString) then
SetLength(Result, StrLen(PChar(Result)))
else ReadError(Name);
end
else Result := "";
end;


Внук   (2002-09-24 17:51:00) [3]

Если lpValueName=nil, то значение читаться не будет, просто произведется проверка на существование параметра с заданным именем. Ссылок у меня нет, извини, вроде английской справки достаточно :)


Mazenrat   (2002-09-24 17:48:00) [4]


> Только PlayCD - это здесь, очевидно, имя параметра. И если
> его нет, функция не вернет ERROR_SUCCESS.


Насколько я понял из файла справки, если в LPTSTR lpValueNameпоставить nil, то будет читаться именно значение по умолчанию, что мне и нужно. Или я что-то не то...

P.S. Буду благодарен за ссылочки об Айпишной работе с реестром на русском языке.


Romkin   (2002-09-24 17:42:00) [5]

Не лучше ли будет пользоваться TRegistry, тогда и глупых вопросов не будет?
Значение получается последними двумя параметрами


Внук   (2002-09-24 17:33:00) [6]

В данной терминологии есть "Имя значения" (ValueName, "параметр", по-Вашему) и "Данные значения" (ValueData, "значение" по-Вашему). Если нужно чтение значения, передавайте в lpData и lpcbData вместо nil нужные переменные - указатель на буфер и его длину.
Только PlayCD - это здесь, очевидно, имя параметра. И если его нет, функция не вернет ERROR_SUCCESS.


Mazenrat   (2002-09-24 17:22:00) [7]

Ладно... Открываем программу Regedit.exeи в левой части видим:
Параметр |Значение

Я это к тому, что RegQueryValueEx(Key, PChar(ValueName),nil, nil, nil, nil)считываем параметр, а мне нужно чтение значения.


Внук   (2002-09-24 17:14:00) [8]

LONG RegQueryValueEx(

HKEY hKey, // handle of key to query
LPTSTR lpValueName, // address of name of value to query
LPDWORD lpReserved, // reserved, must be NULLLPDWORD lpType, // address of buffer for value type
LPBYTE lpData, // address of data buffer
LPDWORD lpcbData // address of data buffer size
);


Mazenrat   (2002-09-24 17:12:00) [9]

Разве? А третим что?


Внук   (2002-09-24 16:21:00) [10]

Не понял :)
Имя параметра указывается вторым аргументом, а не третьим, и читай, что душе угодно


Mazenrat   (2002-09-24 16:17:00) [11]

Мне нужно прочитать значение, а не параметр.


Внук   (2002-09-24 16:01:00) [12]

Result := RegQueryValueEx(Key, PChar(ValueName),nil, nil, nil, nil) = ERROR_SUCCESS;


Наверх

Титульная страница Поиск, карта сайта Написать письмо