Как я могу получить название Программы, связанной с расширением файла с помощью Delphi?

Я должен получить название программы, в настоящее время связываемой с расширением файла для текущего пользователя. Если Вы щелкаете правой кнопкой по файлу и выбираете свойства, то то, в чем я нуждаюсь, является названием программы, которое является направо от, "Открывается" строкой.

например, Для ".xls", я хочу смочь получить ответ "Microsoft Office, Excel", или безотносительно программируют пользователя, имеет как их программа по умолчанию для открытия .xls файлов.

Я решил, что это не столь легко как просто вход в HKEY_CLASSES_ROOT и выбирание это, так как это может также быть указано в HKEY_LOCAL_MACHINE или HKEY_CURRENT_USER или HKEY_USERS.

Возможно, все, что я должен знать, является иерархией, используемой Windows для определения этого и как добраться до каждого из местоположений. Конечно, Windows API call, чтобы сделать это было бы идеально.

Это - подобный вопрос: Как получить значок и описание от расширения файла с помощью Delphi? но тот вопрос только ответил, как получить описание расширения и значок связанной программы. Я не мог найти способ расширить это, чтобы также получить название связанной программы.

Я использую Delphi 2009 и нуждаюсь в решении, которое работает над Windows XP, Vista и 7.


Спасибо всем за Ваши ответы.

Это появляется моя вера, что название исполняемого файла не находится в Реестре, в конце концов. И после оглядывания экстенсивно для Windows API, который даст имя, я не мог найти тот.

Я думаю, что ответ Mef затем является лучшим. Получить название исполняемого файла от информации, включенной в исполняемый файл программы.

9
задан Community 23 May 2017 в 10:30
поделиться

6 ответов

Да, в списке рассылки разработчиков Emacs ведется долгое обсуждение интеграции диспетчера пакетов package.el в следующий основной выпуск Emacs: Интеграция package.el . Он автоматически загружает и устанавливает пакеты из ELPA (архив пакетов Emacs Lisp . Прочтите страницу установки , чтобы получить последнюю версию.

-121 --- 3909407] -

Шаг 1

Получите исполняемый файл, который назначен расширению файла, например, с помощью следующей функции:

uses Registry, Windows, SysUtils;

function GetAssociation(const DocFileName: string): string;
var
  FileClass: string;
  Reg: TRegistry;
begin
  Result := '';
  Reg := TRegistry.Create(KEY_EXECUTE);
  Reg.RootKey := HKEY_CLASSES_ROOT;
  FileClass := '';
  if Reg.OpenKeyReadOnly(ExtractFileExt(DocFileName)) then
  begin
    FileClass := Reg.ReadString('');
    Reg.CloseKey;
  end;
  if FileClass <> '' then begin
    if Reg.OpenKeyReadOnly(FileClass + '\Shell\Open\Command') then
    begin
      Result := Reg.ReadString('');
      Reg.CloseKey;
    end;
  end;
  Reg.Free;
end;

(См. здесь , или ответ marc_s на этот вопрос :-)

Шаг 2

Теперь вы можете прочитать название программы из информации о версии этого исполняемого файла! Самый простой способ - использовать класс TVersionInfo, который вы можете найти через Google, например здесь .

var VersionInfo: TVersionInfo;  
VersionInfo := TVersionInfo.Create('PathToExe\name.exe');  
s := VersionInfo.KeyValue['Description'];

Однако вы должны знать, что некоторые программы используют ключ описания (например, сама RAD Studio или MS Excel), в то время как другие используют ключ названия продукта ...

4
ответ дан 4 December 2019 в 08:15
поделиться

Delphi поставляется с модулем ShellApi.pas, который используется в примере кода ниже. Файл должен существовать.

Вот как это использовать:

function MyShellFindExecutable(const aFileName: string): string;
var
  Buffer: array[0..WINDOWS.MAX_PATH] of Char;
begin
  Result := '';
  FillChar(Buffer, SizeOf(Buffer), #0);
  if (SHELLAPI.FindExecutable(PChar(aFileName), nil, Buffer) > 32) then
    Result := Buffer;
end;
4
ответ дан 4 December 2019 в 08:15
поделиться

Как насчет этой статьи: Определение связанного приложения

В конкретном случае Excel вы найдете .xls расширение в HKEY_CLASSES_ROOT - значение по умолчанию для этой записи Excel.Sheet.8 .

Когда вы снова выполните поиск Excel.Sheet.8 в HKEY_CLASSES_ROOT, вы найдете запись со значением по умолчанию Microsoft Office Excel 97-2003 Worksheet - вероятно, это Лучше не бывает.

3
ответ дан 4 December 2019 в 08:15
поделиться

Не копайтесь в реестре, когда есть функции API, предназначенные для того, чтобы делать то, что вам нужно.

В вашем случае вам нужна AssocQueryString . Вы можете указать ему расширение имени файла, и он сообщит вашей программе, что она должна обрабатывать это расширение ( AssocStr_Executable ). Если вы планируете запустить эту программу для открытия документа, тогда вам действительно понадобится командная строка, а не только исполняемый файл; AssocQueryString также может предоставить вам это ( AssocStr_Command ). Он также может сообщить вам тип документа, например, тот, который отображается в проводнике Windows, например, «Текстовый документ» или «Zip-архив» ( AssocStr_FriendlyDocName ).

Эта функция API является оболочкой для интерфейса IQueryAssociations . Если вы ищете программы из многих типов файлов или множества строк, связанных с одним типом, вы можете создать экземпляр этого интерфейса и использовать его повторно вместо того, чтобы вызывать функцию API снова и снова.

11
ответ дан 4 December 2019 в 08:15
поделиться

Я думаю, что вам нужно объединить ответы Мефа и Роба Кеннеди.

Возьмите ответ Роба Кеннеди и сделайте шаг 2 из ответа Мефа. Читать реестр напрямую - не очень хорошо, поэтому вам следует выбросить его часть 1.

Но я не ищу дружественное имя типа файла.

AssocQueryString возвращает не только дружественное имя типа файла (ASSOCSTR_FRIENDLYDOCNAME), но и может вернуть имя исполняемого файла для открытия (ASSOCSTR_EXECUTABLE) - это то, что вам нужно.

Даже больше, чем это: Я не уверен, но может быть ASSOCSTR_FRIENDLYAPPNAME будет соответствовать вашим потребностям. В этом случае вы можете использовать только ответ Роба Кеннеди.

Проблема прямого чтения реестра заключается в том, что он может вернуть неверную информацию. Это происходит потому, что вы читаете системные настройки - то, что зарегистрировано приложением. Но пользователь может переопределить это. Например, он может щелкнуть правой кнопкой мыши на .xls и выбрать "Открыть с помощью..." -> "Другое приложение". -> "OpenOffice" -> "Использовать это приложение всегда". Регистрационная информация для типа .xls не будет изменена (предпочтения пользователя сохраняются в отдельном месте, поэтому приложения не могут их изменить), поэтому ваш код (который читает реестр напрямую) будет продолжать выдавать "MS Excel", даже если пользователь дважды щелкнет по файлу - будет запущен OpenOffice.

4
ответ дан 4 December 2019 в 08:15
поделиться

Если пользователь говорит "использовать это приложение всегда" для .xls-файлов, информация хранится в

HK_CU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xls

В ключе есть запись "Application", содержащая имя приложения (например, "soffice.exe"). Он соотносится с ключом Applcication в HK_CR, например, HK_CR\Applications\soffice.exe\

0
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: