Я должен получить название программы, в настоящее время связываемой с расширением файла для текущего пользователя. Если Вы щелкаете правой кнопкой по файлу и выбираете свойства, то то, в чем я нуждаюсь, является названием программы, которое является направо от, "Открывается" строкой.
например, Для ".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 затем является лучшим. Получить название исполняемого файла от информации, включенной в исполняемый файл программы.
Да, в списке рассылки разработчиков Emacs ведется долгое обсуждение интеграции диспетчера пакетов package.el в следующий основной выпуск Emacs: Интеграция package.el . Он автоматически загружает и устанавливает пакеты из ELPA (архив пакетов Emacs Lisp . Прочтите страницу установки , чтобы получить последнюю версию.
-121 --- 3909407] -Получите исполняемый файл, который назначен расширению файла, например, с помощью следующей функции:
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 на этот вопрос :-)
Теперь вы можете прочитать название программы из информации о версии этого исполняемого файла! Самый простой способ - использовать класс TVersionInfo, который вы можете найти через Google, например здесь .
var VersionInfo: TVersionInfo;
VersionInfo := TVersionInfo.Create('PathToExe\name.exe');
s := VersionInfo.KeyValue['Description'];
Однако вы должны знать, что некоторые программы используют ключ описания (например, сама RAD Studio или MS Excel), в то время как другие используют ключ названия продукта ...
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;
Как насчет этой статьи: Определение связанного приложения
В конкретном случае Excel вы найдете .xls
расширение в HKEY_CLASSES_ROOT - значение по умолчанию для этой записи Excel.Sheet.8
.
Когда вы снова выполните поиск Excel.Sheet.8
в HKEY_CLASSES_ROOT, вы найдете запись со значением по умолчанию Microsoft Office Excel 97-2003 Worksheet
- вероятно, это Лучше не бывает.
Не копайтесь в реестре, когда есть функции API, предназначенные для того, чтобы делать то, что вам нужно.
В вашем случае вам нужна AssocQueryString
. Вы можете указать ему расширение имени файла, и он сообщит вашей программе, что она должна обрабатывать это расширение ( AssocStr_Executable
). Если вы планируете запустить эту программу для открытия документа, тогда вам действительно понадобится командная строка, а не только исполняемый файл; AssocQueryString
также может предоставить вам это ( AssocStr_Command
). Он также может сообщить вам тип документа, например, тот, который отображается в проводнике Windows, например, «Текстовый документ» или «Zip-архив» ( AssocStr_FriendlyDocName
).
Эта функция API является оболочкой для интерфейса IQueryAssociations
. Если вы ищете программы из многих типов файлов или множества строк, связанных с одним типом, вы можете создать экземпляр этого интерфейса и использовать его повторно вместо того, чтобы вызывать функцию API снова и снова.
Я думаю, что вам нужно объединить ответы Мефа и Роба Кеннеди.
Возьмите ответ Роба Кеннеди и сделайте шаг 2 из ответа Мефа. Читать реестр напрямую - не очень хорошо, поэтому вам следует выбросить его часть 1.
Но я не ищу дружественное имя типа файла.
AssocQueryString возвращает не только дружественное имя типа файла (ASSOCSTR_FRIENDLYDOCNAME), но и может вернуть имя исполняемого файла для открытия (ASSOCSTR_EXECUTABLE) - это то, что вам нужно.
Даже больше, чем это: Я не уверен, но может быть ASSOCSTR_FRIENDLYAPPNAME будет соответствовать вашим потребностям. В этом случае вы можете использовать только ответ Роба Кеннеди.
Проблема прямого чтения реестра заключается в том, что он может вернуть неверную информацию. Это происходит потому, что вы читаете системные настройки - то, что зарегистрировано приложением. Но пользователь может переопределить это. Например, он может щелкнуть правой кнопкой мыши на .xls и выбрать "Открыть с помощью..." -> "Другое приложение". -> "OpenOffice" -> "Использовать это приложение всегда". Регистрационная информация для типа .xls не будет изменена (предпочтения пользователя сохраняются в отдельном месте, поэтому приложения не могут их изменить), поэтому ваш код (который читает реестр напрямую) будет продолжать выдавать "MS Excel", даже если пользователь дважды щелкнет по файлу - будет запущен OpenOffice.
Если пользователь говорит "использовать это приложение всегда" для .xls-файлов, информация хранится в
HK_CU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xls
В ключе есть запись "Application", содержащая имя приложения (например, "soffice.exe"). Он соотносится с ключом Applcication в HK_CR, например, HK_CR\Applications\soffice.exe\