Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Вниз

Помогите разобраться с реестром   Найти похожие ветки 

 
alvin   (2002-11-28 06:37) [0]

Имеется код по добыче из реестра пути установки Winampа (по другому что-то не нашел :)


uses windows,messages;

...
...
...

var
r_value:string;
r_WA:HKEY;
cb:integer;
value:array[0..100] of char;
tmp:string;
...
...
...
try
RegOpenKey(HKEY_CLASSES_ROOT,"Winamp.File\shell\open\command\",r_WA);
RegQueryValue(HKEY_CLASSES_ROOT,"Winamp.File\shell\open\command\",value,cb);
tmp:=value;
r_value:=copy(tmp,2,length(tmp)-7);
WinExec(PChar(r_value),SW_SHOWNORMAL);
finally
RegCloseKey(r_WA);

Подскажите где у меня ошибка, этот код странным образом не работает в WinMe, но при этом работает в WinXP. Он также работает в "нормальном" проекте Delphi (т.е. с использованием VCL), но не работает в проекте написанном только средствами WinAPI


 
Внук   (2002-11-28 09:33) [1]

Сурово... Открыли один ключ, а читаем из другого. Может быть
RegQueryValue(r_WA,"",value,cb);
все-таки?

И что в данном случае означает любимая всеми абстрактная фраза "не работает"?


 
Dimka Maslov   (2002-11-28 19:48) [2]

1. Слеш в конце строки убери.
"Winamp.File\shell\open\command"

2. Воспользуйся
function RegQueryStr(RootKey: HKEY; Key, Name: string;
Success: PBoolean = nil): string;
var
Handle: HKEY;
Res: LongInt;
DataType, DataSize: DWORD;
begin
if Assigned(Success) then Success^:=False;
Res:=RegOpenKeyEx(RootKey, PChar(Key), 0, KEY_QUERY_VALUE, Handle);
if Res<>ERROR_SUCCESS then Exit;
Res:=RegQueryValueEx(Handle, PChar(Name), nil, @DataType, nil, @DataSize);
if (Res<>ERROR_SUCCESS) or (DataType<>REG_SZ) then begin
RegCloseKey(Handle);
Exit;
end;
SetString(Result, nil, DataSize-1);
Res:=RegQueryValueEx(Handle, PChar(Name), nil, @DataType,
PByte(@Result[1]), @DataSize);
if Assigned(Success) then Success^:=Res=ERROR_SUCCESS;
RegCloseKey(Handle);
end;


 
alvin   (2002-11-29 07:07) [3]

"Не работает" в смысле в качесве пути выдает либо пустую строку, либо какие-то символы (это под WinMe с использованием WinAPI). С открытием одного ключа и чтением из другого я конечно погорячился, дело в том, что в реестром через API я не работал, видимо поэтому имеют место этакие казусы (благодарю Внук, это действительно надо бы подправить). Меня смущает ее работоспособность в одном сочетании (VCL+WinMe,VCL+WinXP,WinAPI+WinXP) и полный отказ от работы в WinAPI+WinMe.
Слеш я уберал,но ничего не помогло.Спасибо за функцию.


 
Внук   (2002-11-29 09:21) [4]

Неплохо было бы посмотреть коды ошибок

RegOpenKey(HKEY_CLASSES_ROOT,"Winamp.File\shell\open\command",r_WA);
ShowMessage(SysErrorMessage(GetLastError));

RegQueryValue(r_WA,"",value,cb);
ShowMessage(SysErrorMessage(GetLastError));


 
alvin   (2002-11-29 10:08) [5]

Исправил на RegQueryValue(r_WA,"",value,cb);
"Оперция выполнена успешно",
при этом r_value под WinWp уазывает путь к Winamp (и запускает WinAmp), а под WinMe пустая строка. Парадокс.


 
Внук   (2002-11-29 13:52) [6]

Не все спокойно в Королевстве Датском...

Даже не знаю, что еще сказать. Все работает у меня. Под Win2000, WinXP, WinME.

Интересно, а после вызова RegQueryValue(r_WA,"",NIL,cb); чему равно cb?

И вот так:
RegQueryValue(r_WA,"",@value,cb);


 
Cobalt   (2002-11-30 00:13) [7]

А еще поробуй в cb записать 100 (до RegQueryValue)


 
alvin   (2002-11-30 09:36) [8]

cb=5505024
RegQueryValue(r_WA,"",@value,cb); не помогло

После того как записал в cb 100, вернули значение cb=42 и все заработало.

Огромное спасибо всем кто принимал участие в обсуждении этого вопроса.

Уважаемый Cobalt, не могли бы пояснить чего это было за заклинание такое?


 
Внук   (2002-11-30 13:58) [9]

lpcbValue
Points to a variable specifying the size, in bytes, of the buffer pointed to by the lpValue parameter. When the function returns, this variable contains the size of the data copied to lpValue, including the terminating null character.

То есть, в этой переменной нужно указать размер буфера, в который помещается значение. А при возврате функция установит там количество реально прочитанных данных. Поэтому я и поинтересовался значением cb. Понятно, что cb=5505024 - это полный бред :)

Правда, Cobalt © оказался более милосердным, без намеков сразу дал ответ :)


 
alvin   (2002-12-01 09:01) [10]

Теперь ситуация совсем прояснилась. Благодарю Внука за популярное разъяснение. Еще раз всем спасибо!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
14-49275
McSimm
2002-12-27 10:54
2003.01.16
Режим


1-49041
AlekseyK
2003-01-03 11:37
2003.01.16
StringGrid в Word


4-49375
race1
2002-11-28 06:34
2003.01.16
api


14-49237
Driverrr
2002-12-26 16:27
2003.01.16
NTFS


14-49217
nika_ufc
2002-12-29 16:22
2003.01.16
Помагите





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