Как узнать путь к файлу, вызванному открытием файла с пользовательским расширением? - PullRequest
7 голосов
/ 19 января 2009

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 20 января 2009

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

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

ArthurApp.exe "%1"

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

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

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

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

0 голосов
/ 20 января 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 получает информацию о расширениях файлов и как мне узнать об этом действии? .

...