Как узнать путь к файлу, запускаемому открытием файла с произвольным расширением?

Как мне получить местоположение файла, который я использовал для открытия своих программ?

Пример: если я создаю новое расширение ".xyz", скажем, и я говорю Windows, что я хочу открыть файл типа .xyz с моим приложением, тогда оно запускает мое приложение. Отлично, но как мое приложение получает дескриптор пути к файлу, который использовался для его запуска?

Кроме того, есть ли способ сохранить только одну версию моего приложения и открыть новые файлы, чтобы просто вызвать метод в моем приложении? Например, если вы используете торрент и открываете 5 файлов .torrent, все они просто передаются одному приложению.

Дополнительный вопрос: все ли расширения файлов состоят из 3 букв и есть ли список общедоступных? Если я создаю расширение файла, я не хочу использовать уже используемое.


person Arthur    schedule 19.01.2009    source источник
comment
То есть 3 вопроса.   -  person Raedwald    schedule 20.01.2015


Ответы (2)


Когда вы создали ассоциацию файлов, вы указали командную строку, которую Explorer должен запустить для активации вашей программы. Оболочка также помещает имя файла документа в командную строку, поэтому в вашей программе проверьте аргументы командной строки. Как вы это сделаете, зависит от вашего языка и среды разработки. В Delphi используйте ParamCount и ParamStr.

Когда вы создаете ассоциацию файлов, вы можете указать, где именно в командной строке должно находиться имя файла документа. Используйте %1 где-нибудь в командной строке, и оболочка заменит его именем файла. Поскольку имена файлов Windows часто содержат пробелы, имя файла следует заключать в кавычки, чтобы командная строка в ассоциации файлов выглядела так:

ArthurApp.exe "%1"

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

Механизм ассоциации файлов оболочки уже имеет способ связи через DDE, поэтому второй экземпляр вашей программы вообще не будет запущен. Вместо этого оболочка начнет диалог DDE с уже запущенным экземпляром и таким образом сообщит ему новое имя файла. Однако в настоящее время DDE, похоже, теряет популярность, поэтому сначала ознакомьтесь с некоторыми другими вариантами.

Что касается вашего дополнительного вопроса, нет, расширения не всегда состоят из трех символов. Оглянитесь вокруг, и это должно быть очевидно: код C помещается в файлы .c, графика Adobe Illustrator помещается в файлы .ai, а новые документы Microsoft Word помещаются в файлы . файлы .docx.

Но будьте осторожны. Если вы запросите **.doc*, результаты также будут включать файлы .docx. Это связано с тем, что FindFirstFile соответствует как коротким, так и длинным именам файлов, а длинные имена файлов с длинными расширениями имеют трехсимвольные расширения в версиях с короткими именами файлов.

person Rob Kennedy    schedule 19.01.2009

Роб прекрасно ответил на ваш вопрос (вопросы).

Что касается последней части, есть ли общедоступный список расширений файлов - нет как таковой, но есть shell.windows.com, веб-сервис Explorer использует для поиска обработчиков для неизвестных расширений файлов. Вы можете создать расширение, а затем запросить shell.windows.com, чтобы узнать, было ли оно зарегистрировано. Например, чтобы проверить, зарегистрировано ли кем-либо расширение .blah на shell.windows.com, просто откройте этот URL-адрес в любом браузере:

http://shell.windows.com/fileassoc/0409/xml/redir.asp?ext=blah

Конечно, замените конечный blah своим расширением.

Подробнее об этом можно узнать в KB929149 и в сообщении Рэймонда Чена Откуда shell.windows.com получает информацию о расширениях файлов и как мне получить это действие?.

person Mihai Limbășan    schedule 20.01.2009