Форум: "WinAPI";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
ВнизRegQueryValueEx. Помогите! Найти похожие ветки
← →
Mazenrat (2002-09-24 15:42) [0]Доброго времени суток.
Люди!!! Помоги разобраться, почему не работает моя конструкция. Проблема в том, что есть значение или нет - всё-равно выдаётся сообщение "Значение есть".
function ExistsPlayCD(const ValueName: string):Boolean;
var
Key : HKey;
begin
if RegOpenKeyEx(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;
if ExistsPlayCD("PlayCD") then
MessageBox(0,"Значение есть","",MB_OK)
else
MessageBox(0,"Нет","",MB_OK);
← →
Внук (2002-09-24 16:01) [1]Result := RegQueryValueEx(Key, PChar(ValueName),nil, nil, nil, nil) = ERROR_SUCCESS;
← →
Mazenrat (2002-09-24 16:17) [2]Мне нужно прочитать значение, а не параметр.
← →
Внук (2002-09-24 16:21) [3]Не понял :)
Имя параметра указывается вторым аргументом, а не третьим, и читай, что душе угодно
← →
Mazenrat (2002-09-24 17:12) [4]Разве? А третим что?
← →
Внук (2002-09-24 17:14) [5]LONG RegQueryValueEx(
HKEY hKey, // handle of key to query
LPTSTR lpValueName, // address of name of value to query
LPDWORD lpReserved, // reserved, must be NULL LPDWORD 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:22) [6]Ладно... Открываем программу Regedit.exe и в левой части видим:
Параметр | Значение
Я это к тому, чтоRegQueryValueEx(Key, PChar(ValueName),nil, nil, nil, nil)
считываем параметр, а мне нужно чтение значения.
← →
Внук (2002-09-24 17:33) [7]В данной терминологии есть "Имя значения" (ValueName, "параметр", по-Вашему) и "Данные значения" (ValueData, "значение" по-Вашему). Если нужно чтение значения, передавайте в lpData и lpcbData вместо nil нужные переменные - указатель на буфер и его длину.
Только PlayCD - это здесь, очевидно, имя параметра. И если его нет, функция не вернет ERROR_SUCCESS.
← →
Romkin (2002-09-24 17:42) [8]Не лучше ли будет пользоваться TRegistry, тогда и глупых вопросов не будет?
Значение получается последними двумя параметрами
← →
Mazenrat (2002-09-24 17:48) [9]
> Только PlayCD - это здесь, очевидно, имя параметра. И если
> его нет, функция не вернет ERROR_SUCCESS.
Насколько я понял из файла справки, если в LPTSTR lpValueName поставить nil, то будет читаться именно значение по умолчанию, что мне и нужно. Или я что-то не то...
P.S. Буду благодарен за ссылочки об Айпишной работе с реестром на русском языке.
← →
Внук (2002-09-24 17:51) [10]Если lpValueName=nil, то значение читаться не будет, просто произведется проверка на существование параметра с заданным именем. Ссылок у меня нет, извини, вроде английской справки достаточно :)
← →
Romkin (2002-09-24 17:54) [11]Достаточно посмотреть исходник 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;
← →
Sonic (2002-09-24 22:59) [12]Если ответить в двух словах то надо
заменить строку
Result := RegQueryValueEx(Key, nil, PChar(ValueName), nil, nil, nil) = ERROR_SUCCESS;
на
Result := RegQueryValueEx(Key, PChar(ValueName), nil, nil, nil, nil) = ERROR_SUCCESS;
должно работать.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c