7

Я написал реестр, который создает .myext .

Двойной щелчок на моем file.myext указывает на мой исполняемый файл (преобразованный из пакетного файла, открывающего файл .jar), который затем открывает мое приложение блокнота.


Реестр

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.myext]
@="myext"

[HKEY_CLASSES_ROOT\.myext\ShellNew]

[HKEY_CLASSES_ROOT\myext]
@=".myext file"
"EditFlags"=dword:00000000
"BrowserFlags"=dword:00000008

[HKEY_CLASSES_ROOT\myext\DefaultIcon]
@="C:\\...\\icon.ico, 0"

[HKEY_CLASSES_ROOT\myext\shell]

[HKEY_CLASSES_ROOT\myext\shell\Open]

[HKEY_CLASSES_ROOT\myext\shell\Open\command]
@="C:\\...\\run.exe %1"

Мой исполняемый файл (run.exe), преобразованный из пакета

start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar"

Проблема?

Я не знаю, почему я получаю это сообщение об ошибке. Возможно, именно это приложение преобразования вызывает некоторые проблемы.


SUGGESTIONS

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

PS Я не использую DDE и больше не получаю сообщение об ошибке: "file.myext" is not a valid Win32 application .

Пакетное предложение

start "Mike's Text Editor" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar"

start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar" "%1"

РЕГИСТРАЦИОННОЕ ПРЕДЛОЖЕНИЕ

[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\...\\run.exe\" \"%1\""

3 ответа3

4

Ваша проблема в том, как вы используете команду start .

Помещая первый параметр в "" вы назначаете его в качестве заголовка окна для запущенной программы. Затем вы передаете %1 (что вы отметили в комментариях к вашему вопросу). %1 - это имя файла .myext по которому вы щелкнули. Так что start файла пытается выполнить.

Что приводит к ошибке, которую вы видите.

Итак, чтобы решить это, просто используйте start как это:

start "something" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar"

Ожидается, что первый переданный в start параметр, заключенный в "" , будет заголовком получающегося (консольного) окна.

Предполагается, что вторым параметром (который не начинается с /) будет исполняемый файл для запуска. Если путь к нему содержит пробелы, он должен быть заключен в "" . В противном случае они необязательны.

Третий и все последующие параметры будут переданы в исполняемый файл.
Поэтому их не нужно заключать в "" отдельно. Но вы должны вложить пути (которые содержат пробелы) в этих параметрах в "" , так что исполняемый файл может анализировать их должным образом при запуске.

2

проблема

Ваша команда установлена на это:

@="C:\\...\\run.exe %1"

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

C:\Foobar\run.exe c:\test.myext

Если в файле (или его пути) есть пробелы, программа может или может работать правильно, в зависимости от того, как она интерпретирует свои аргументы:

C:\Foobar\run.exe C:\My Docs\test.myext /switch

Является ли C:\My аргумент один и Docs\test.myext аргумент два? Являются ли все аргументы одной строкой? Есть ли какая-то особая интерпретация?

Если в вашей программе есть пробелы (или ее путь), то Windows не сможет определить, какие части являются путем и / или именем файла, а какие являются другими аргументами:

C:\Program Files\Foobar\run.exe C:\test.myext

Windows пытается запустить файл C:\Program и передать в качестве аргументов Files\Foobar\run.exe и C:\test.myext .

Как видите, это явно не правильное имя файла. Если вы введете его в диалоговом окне «Выполнить», вы получите сообщение об ошибке « Не найден / не действительный» .


Решение

Что вам нужно сделать, это обернуть имена файлов / путей в кавычки, чтобы уточнить, что они представляют собой единое целое. Это обычно просто, но не всегда.

В вашем случае это должно быть довольно легко. Если вы вводите его непосредственно в Regedit, используйте это (при необходимости заменяя пути). Перейдите к HKCR\myext\shell\open\command отредактируйте элемент по умолчанию и установите для него:

"C:\Program Files\Foobar\run.exe" "%1"

Если вы кладете это в .REG файл, используйте это:

[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\Program Files\\Foobar\\run.exe\" \"%1\""

Обратите внимание на то, что косые черты и кавычки экранируются (с косой чертой), но и программа, и аргумент файла заключаются в кавычки. Это хорошо независимо от того, есть ли пробелы в пути / имени файла; это просто безопаснее.

Кроме того, вы можете заменить %1 на %L чтобы передать полный путь к файлу, если ваша программа этого требует.

1

Новый ответ

Это тот минимум, который нужно правильно связать. Я узнал об этом, попробовав свой собственный совет № 4 ниже (Вы можете узнать, как Windows делает это для вас ...).

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.myext]
@="myext"

[HKEY_CLASSES_ROOT\myext]
@=".myext file"

[HKEY_CLASSES_ROOT\myext\shell]

[HKEY_CLASSES_ROOT\myext\shell\open]

[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\...\\run.exe\" \"%1\""

При необходимости вы можете добавить DefaultIcon и другие вещи, но без DefaultIcon Windows просто будет использовать значок в run.exe (если он есть). Вы можете добавить его в конвертере Batch To Exe при создании run.exe).

Важность %1 и кавычек

Причина, по которой вам нужно поместить %1 состоит в том, чтобы передать путь и имя связанного файла (file.myext) в программу run.exe . Без этого ваша ассоциация бессмысленна, поскольку она функционирует просто как ярлык. Это не нужно, так как вы можете просто создать нормальный ярлык для run.exe для той же цели.

Ваш пакетный файл также должен иметь %1 где-то внутри, чтобы путь и имя связанного файла (file.myext) использовались внутри пакетного файла (предположительно, чтобы передать его в ваш mjar.jar который будет что-то делать с файлом) , В противном случае, независимо от того, на каком связанном файле вы дважды щелкнете, вы всегда получите один и тот же результат из вашей Java-программы. Это снова бессмысленно, так как вы можете просто использовать ярлык для командного файла, чтобы служить той же цели.

Также важно заключить в кавычки %1 , так как пути к файлам могут содержать пробелы, а без кавычек (") эти пробелы могут разбивать путь на два или более аргумента (когда весь путь предполагается рассматривать как один аргумент).

Пример пакетного файла

Вот пакетный файл, который я преобразовал в exe для тестирования. Он просто отображает значение %1 .

@echo %1
@pause

Ваш пакетный файл может быть таким, как показано ниже (чтобы mjar.jar мог получить путь и имя файла, по которому вы дважды щелкнули ):

start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar" "%1"

Я связал exe файл с расширением .myext (используя метод из моего совета 4), а затем проверил реестр, чтобы создать вышеупомянутый файл .reg . Когда я дважды щелкаю по файлу с расширением .myext , открывается командное окно, отображающее (команда echo ) путь и имя файла, по которому я дважды щелкнул (так мой тестовый пакетный файл использует связанный файл).

Java программа

(Это краткое изложение полного обсуждения в чате, которое в конечном итоге решило вашу проблему.) Ваша Java-программа, содержащаяся в mjar.jar должна быть готова принять входящий аргумент и использовать его. Ваше намерение состоит в том, чтобы ваша программа автоматически открывала файл, на который ссылается входящий аргумент, и отображала его содержимое. Следовательно, main метод должен быть примерно таким:

public static void main (String[] args) {
    if (args.length >= 1) {
        openFile(args[0]); 
    }
}

Метод openFile - это метод, который открывает файл по переданному в него имени. Оператор if гарантирует, что args[0] читается только при наличии такого аргумента (исключая ArrayIndexOutOfBoundsException). В приведенном выше коде используется только первый аргумент args[0] ; все остальные аргументы (args[1] , args[2] и т. д.) игнорируются. Метод openFile будет выглядеть примерно так (дескрипторы и возвращаемые типы не включены):

openFile(String filename) {
    // code here to open the file referred by "filename" variable,
    // read its contents and display it on the GUI
    // or use it in the program as intended
}

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

Предыдущий ответ

У меня пока нет окончательного ответа на вашу проблему , но вот несколько советов, с которых можно начать:

  • Вы пытались добавить цитаты? Вот так : @="\"C:\\...\\run.exe\" \"%1\""
    В реестре значение (по умолчанию) будет выглядеть так: "C:\...\run.exe" "%1"

  • Прочтите официальный документ MSDN от Microsoft об ассоциации типов файлов. Вам также нужно будет прочитать о программных идентификаторах (ссылки в первом параграфе этого документа).

  • Попробуйте сначала связать ваш тип файла .myext с Блокнотом. Узнайте, как Блокнот связан с файлами .txt и следуйте примеру. Если все сделано правильно, Блокнот должен открыть файл file.myext .

  • Вы можете узнать, как Windows делает это для вас. Щелкните правой кнопкой мыши file.myext , выберите « Открыть с помощью»> «Выбрать программу по умолчанию ...» и нажмите « Обзор», чтобы найти файл run.exe . Свяжитесь и откройте, затем исследуйте реестр Windows, чтобы узнать, как Windows хранила вашу ручную связь. Затем вы можете просто экспортировать тип файла и программный идентификатор в reg файлы.

^ Если file.myext , нажмите « Открыть»> «Выбрать программу из списка установленных программ».

PS1: Очевидно, у вас должна быть двойная косая черта в файлах .reg.
PS2: Лучше напрямую редактировать материал в реестре, тестировать эффекты, затем экспортировать ключи в файлы .reg и объединять их в один файл, а не создавать файл .reg самостоятельно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .