Юзер подходит к программисту и спрашивает:
- У меня почемуто пейджмейкеровский файл в ворде не открывается.
- И не откроется, там же расширения разные.
- Так я его переименовал.
uses{$IFDEF WIN32}
Registry; {We will get it from the registry}{$ELSE}
IniFiles; {We will get it from the win.ini file}{$ENDIF}{$IFNDEF WIN32}const
MAX_PATH = 144;
{$ENDIF}function GetProgramAssociation(Ext: string): string;
var{$IFDEF WIN32}
reg: TRegistry;
s: string;
{$ELSE}
WinIni: TIniFile;
WinIniFileName: array[0..MAX_PATH] of char;
s: string;
{$ENDIF}begin{$IFDEF WIN32}
s := '';
reg := TRegistry.Create;
reg.RootKey := HKEY_CLASSES_ROOT;
if reg.OpenKey('.' + ext + '\shell\open\command',
false) <> falsethenbegin{The open command has been found}
s := reg.ReadString('');
reg.CloseKey;
endelsebegin{perhaps thier is a system file pointer}if reg.OpenKey('.' + ext,
false) <> falsethenbegin
s := reg.ReadString('');
reg.CloseKey;
if s <> '' thenbegin{A system file pointer was found}if reg.OpenKey(s + '\shell\open\command',
false) <> falsethen{The open command has been found}
s := reg.ReadString('');
reg.CloseKey;
end;
end;
end;
{Delete any command line, quotes and spaces}if Pos('%', s) > 0 then
Delete(s, Pos('%', s), length(s));
if ((length(s) > 0) and
(s[1] = '"')) then
Delete(s, 1, 1);
if ((length(s) > 0) and
(s[length(s)] = '"')) then
Delete(s, Length(s), 1);
while ((length(s) > 0) and
((s[length(s)] = #32) or
(s[length(s)] = '"'))) do
Delete(s, Length(s), 1);
{$ELSE}
GetWindowsDirectory(WinIniFileName, sizeof(WinIniFileName));
StrCat(WinIniFileName, '\win.ini');
WinIni := TIniFile.Create(WinIniFileName);
s := WinIni.ReadString('Extensions',
ext,
'');
WinIni.Free;
{Delete any command line}if Pos(' ^', s) > 0 then
Delete(s, Pos(' ^', s), length(s));
{$ENDIF}
result := s;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GetProgramAssociation('gif'));
end;
Программа на Delphi, которая извлекает имя программы, связанной с расширением файла, из реестра Windows (на Windows) или файла INI (на других платформах). Это может быть полезно для определения по умолчанию приложения для открытия файла с конкретным расширением.
Следующий процесс:
Функция GetProgramAssociation принимает файловое расширение в качестве входных данных и возвращает имя программы, связанной с этим расширением.
На Windows функция использует реестр для извлечения информации о связях. Она открывает ключ для указанного расширения под корневым ключом "HKEY_CLASSES_ROOT" и затем читает значение субключа "shell\open\command", чтобы получить командную строку, используемую для открытия файлов с этим расширением.
Если не находит связь для конкретного расширения, функция пытается найти системный файл-указатель (файл, связанный с .dll или .exe) под тем же ключом. Если она находит один, она читает субключ "shell\open\command" этого файла, чтобы получить командную строку, используемую для открытия файлов с этим расширением.
На не-Windows платформах функция использует файл INI (обычно именуемый "win.ini") для извлечения информации о связях. Она читает значение указанного расширения из раздела "Extensions" файла INI.
Функция затем удаляет ненужные символы из полученной командной строки, такие как кавычки, пробелы и знаки процента.
В обработчике события Button1Click программа вызывает функцию GetProgramAssociation с расширением GIF файла и отображает результат в сообщении.
Код хорошо организован, но есть несколько минорных проблем:
Константа MAX_PATH определена только на не-Windows платформах, что означает, что она не будет использоваться на Windows. Лучше определить эту константу безусловно.
Функция может быть улучшена более robust handling ошибок. Например, если реестр или файл INI не могут быть открыты, программа должна обрабатывать это ситуацию вместо возвращения пустой строки.
Функция не проверяет является ли полученная командная строка валидной перед возвращением ее. Лучше проверять командную строку перед возвращением.
В целом, код - хороший старт для извлечения связей файлов из реестра Windows или файла INI, но может потребовать некоторых улучшений в обработке ошибок и валидации.
В статье описывается способ получения имени программы, с которой ассоциировано определенное расширение файла.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.