Форум: "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.46 MB
Время: 0.008 c