ОК, я заставил это работать ... Базовые знания - использовать UHID DropHandler в реестре. Я сделал базовую настройку следующим образом:
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 может использоваться для чего-то другого, например. перетаскивать на файлы .jar (конечно, адаптируя).
Эта техника имеет ограниченное применение: мы редко делаем одноклассные программы на Java! Но это выглядело как хороший и интересный вызов, поэтому я не удержался, чтобы его решить. Примечание: вы можете добавить что-то вроде -Djava.ext.dirs="some path;another path"
, если вам когда-нибудь понадобится использовать внешние библиотеки (в jar-файлах).