Главная страница
    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.007 c
3-21392
Ээх
2002-10-17 22:44
2002.11.07
Есть RxDBGrid, нужно сделать горизонтальную прокрутку, но не всех


1-21603
Stream2k
2002-10-25 18:40
2002.11.07
Как по нажатию SpeedButton загрузщить файл file1.htm в браузер...


1-21642
lena13
2002-10-25 17:31
2002.11.07
DriveComboBox DirectoryListBox


3-21412
Vlad_K
2002-10-11 14:02
2002.11.07
RX library


6-21699
BillyJeans
2002-09-05 10:36
2002.11.07
Нужна прога под NT, которая считает трафик...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский