Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-21548
^Sanya
2002-10-28 17:22
2002.11.07
private vs implementation...


7-21844
Алмаз
2002-09-04 16:33
2002.11.07
использование звуковой карты


4-21866
TPig
2002-09-24 16:01
2002.11.07
Помогите с ACL!!!!!!!!!! Никак не удается получить список АСЕ


1-21589
GIL
2002-10-29 23:16
2002.11.07
Создание ярлыков


3-21380
Шурик Ш
2002-10-17 17:06
2002.11.07
Помогите составить запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский