Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.07;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2002.11.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
6-21710
delpher_gray
2002-09-06 11:14
2002.11.07
Передача файлов


3-21384
stone
2002-10-17 10:10
2002.11.07
Экспорт данных из MS SQL


1-21501
novarm44
2002-10-28 02:24
2002.11.07
Чтение/Запись файла


1-21477
Vasechkin
2002-10-28 15:10
2002.11.07
Работа с поддиректориями


3-21420
NeyroSpace
2002-10-18 16:55
2002.11.07
Help! Таблица повисла, ни записи ни ее саму не удалить!