ОК, я заработал ... Основополагающее знание - использовать DropHandler UUID в реестре. Я сделал базовую настройку, а именно:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.class]
@="JavaClass"
[HKEY_CLASSES_ROOT\JavaClass\DefaultIcon]
@="C:\\Java\\jdk1.6.0_05\\bin\\java.exe,1"
[HKEY_CLASSES_ROOT\JavaClass\shell\open]
@="Run Java class"
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\"C:\\Java\\jdk1.6.0_05\\bin\\java.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\JavaClass\shellex\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"
и ... это не сработало!
Я просто забыл, что java.exe хочет имя класса, а не имя файла! Но я не вижу возможности сделать это в реестре.
К счастью, есть временное решение, которое по-прежнему нуждается в файле сценария, если мы хотим быть универсальным, для работы с любыми/всеми файлами класса (со статической основной функцией, конечно!). Не партия, я избегаю их, когда смогу. Я решил использовать WSH, так как он должен быть доступен в любой современной системе Windows. Я также решил создать JS-скрипт, возможно, это был и сценарий VB.
Так что я сделал следующий скрипт (LaunchJavaClass.js):
if (WScript.Arguments.count() == 0)
{
WScript.StdOut.Write("No parameters");
WScript.Quit(1);
}
var className = WScript.Arguments.Item(0);
//~ WScript.StdOut.Write(className + "\n");
var m = className.match(/^(.*)\\(.+?)\.class$/);
if (m == null)
{
WScript.StdOut.Write("Not a class file");
WScript.Quit(1);
}
var classPath = m[1];
className = m[2];
//~ WScript.StdOut.Write(classPath + " >>> " + className + "\n");
var params = new Array();
for (i = 1; i < WScript.Arguments.count(); i++)
{
params[params.length] = WScript.Arguments.Item(i);
}
var cmd = "cmd /c cd /D " + classPath +
" & C:/Java/jdk1.6.0_05/bin/java.exe " +
className + " " + params.join(" ");
//~ WScript.StdOut.Write(cmd + "\n");
var shell = WScript.CreateObject("WScript.Shell");
//~ var exec = shell.Exec(cmd); // Can be used to get stdout
shell.Run(cmd, 0);
я оставил некоторый вывод, а не полезной в этом контексте, но которые могут использоваться для отладки (запуск с Cscript).
Конечно, путь к JRE должен быть отрегулирован.
И я изменил command
в реестре, следующим образом:
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@="\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*"
Конечно, настроить путь, и держать выше других линий.
Теперь, если я перетаскиваю некоторые файлы в файл .class, он получает короткие пути к файлам в качестве аргументов функции main().
import java.io.*;
class TestDnD
{
public static void main(String[] args)
{
Writer output = null;
try
{
output = new BufferedWriter(new FileWriter(new File("LogFile.txt")));
for (String arg : args)
{
output.write(arg + "\n");
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
return;
}
finally
{
try { output.close(); } catch (IOException e) {}
}
}
}
Я думаю, что первая версия файла .reg может быть использована для чего-то еще, например. для drag'n'drop на .jar-файлах (приспосабливая его, конечно).
Этот метод имеет ограниченное применение: мы редко делаем одноклассные программы на Java! Но это выглядело как хорошая и интересная задача, поэтому я не сопротивлялся ее разрешению. Примечание: вы можете добавить такие вещи, как -Djava.ext.dirs="some path;another path"
, если вам когда-либо понадобится использовать внешние библиотеки (в файлах jar).
Любой эквивалент для Mac OS X? У меня тоже есть файл, который я бы хотел перетащить на Java-класс, чтобы предоставить перетаскиваемый файл в качестве аргумента. – Eptin