![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;