Ich habe eine Registrierung geschrieben, die erstellt .myext
.
Ein Doppelklick auf my file.myext
bezieht sich auf meine ausführbare Datei (konvertiert aus einer Batch-Datei, die a öffnet .jar
), die dann meine Editor-Anwendung öffnet.
Die Registrierung
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"
Meine ausführbare Datei (run.exe), die aus einem Stapel konvertiert wurde
start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar"
Problem?
Ich weiß nicht, warum ich diese Fehlermeldung erhalte. Vielleicht war es diese Konvertierungsanwendung , die einige Probleme verursacht.
VORSCHLÄGE
Hier ist, was ich nach allen Vorschlägen getan habe. Ich kann meinen Texteditor erfolgreich öffnen (mit einem der folgenden Vorschläge), nachdem ich auf ein Dokument geklickt habe, aber im Text wird kein Text angezeigtJTextPane
. Wenn ich das Dokument im Windows-Editor öffnen möchte, wird der gesamte Text angezeigt.
PS Ich verwende kein DDE und erhalte keine Fehlermeldung mehr : "file.myext" is not a valid Win32 application
.
VORSCHLÄGE FÜR BATCH-DATEIEN
start "Mike's Text Editor" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar"
start /min "C:\...\javaw.exe -jar" "C:\...\mjar.jar" "%1"
REGISTRIERUNGSVORSCHLAG
[HKEY_CLASSES_ROOT\myext\shell\open\command]
@="\"C:\\...\\run.exe\" \"%1\""
command
Schlüssel zu verwenden, um festzustellen, ob dies funktioniert?command
Schlüssel. Die Fehlermeldung wird angezeigt, wenn ich auf meine Datei doppelklicke, die mit meiner Java-Anwendung gespeichert wurde.run.exe
Nutzung derfile.myext
oder was auch immer Datei mit ihm verbunden? Ich finde keine%1
in Ihrem Batch-Skript, die zur Übergabe von Argumenten erforderlich sind (file.myext
in diesem Fall).start "" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar" %1
? Es sollte ..myext
Dateien und was genau istmjar.jar
? Istmjar.jar
ein Tet-Editor und.myext
Dateien sind Textdateien? Versuchen Sie, einen neuen Textdateityp zu erstellen, der mit einem Java-Texteditor geöffnet wird?Antworten:
Neue Antwort
Dies ist das absolute Minimum, das Sie für eine korrekte Zuordnung benötigen. Ich habe dies herausgefunden, indem ich meinen eigenen Tipp Nummer 4 unten ausprobiert habe ( Sie können herausfinden, wie Windows dies für Sie erledigt ... ).
Sie können DefaultIcon und andere Dinge nach Bedarf hinzufügen, aber ohne DefaultIcon verwendet Windows einfach das Symbol in
run.exe
(falls vorhanden). Sie können eines im Batch-to-Exe-Konverter hinzufügen, wenn Sie das erstellenrun.exe
.Bedeutung
%1
und AnführungszeichenDer Grund, warum Sie ein
%1
dort einfügen müssen, besteht darin, den Pfad und den Namen der zugehörigen Datei (file.myext
) an das Programm zu übergebenrun.exe
. Ohne dies weiterzugeben, ist Ihre Zuordnung sinnlos, da sie lediglich als Verknüpfung fungiert. Dies ist nicht erforderlich, da Sie einfach eine normale Verknüpfung erstellen könnenrun.exe
, um denselben Zweck zu erfüllen.Ihre Batch - Datei sollte auch eine hat
%1
irgendwo im Innern , so dass der Pfad und der Name der zugehörigen Datei (file.myext
) wird verwendet , in der Batch - Datei (vermutlich es passieren zu Ihrenmjar.jar
denen etwas tun mit der Datei). Unabhängig davon, auf welche zugeordnete Datei Sie doppelklicken, erhalten Sie von Ihrem Java-Programm immer das gleiche Ergebnis. Dies ist wiederum sinnlos, da Sie einfach eine Verknüpfung zur Batch-Datei haben können, um denselben Zweck zu erfüllen.Es ist auch wichtig, die
%1
Anführungszeichen einzuschließen , da Dateipfade Leerzeichen enthalten können und"
diese Leerzeichen ohne die Anführungszeichen ( ) den Pfad in zwei oder mehr Argumente aufteilen können (wenn der gesamte Pfad als ein Argument betrachtet werden soll).Beispiel Batch-Datei
Hier ist die Batch-Datei, in die ich zum
exe
Testen konvertiert habe . Es wird einfach angezeigt, was auch immer der Wert von%1
ist.Ihre Batch-Datei könnte wie
mjar.jar
folgt aussehen (damit Sie den Pfad und den Namen der Datei erhalten, auf die Sie doppelklicken):Ich habe die
exe
Datei mit der.myext
Erweiterung verknüpft (mithilfe der Methode in Tipp 4) und dann die Registrierung überprüft, um die obige.reg
Datei zu erstellen . Wenn ich einen Doppelklick auf eine Datei mit.myext
Erweiterung, öffnet sich ein Befehlsfenster angezeigt wird (echo
Befehl) , um den Pfad und den Namen der Datei , die ich doppelt geklickt (dies ist , wie mein Test Batch - Datei wird mit der zugehörigen Datei).Java-Programm
(Dies ist eine Zusammenfassung der vollständigen Chat-Diskussion , die Ihr Problem letztendlich gelöst hat.) Ihr in enthaltenes Java-Programm
mjar.jar
muss darauf vorbereitet sein, das eingehende Argument zu akzeptieren und es zu verwenden. Ihr Programm soll die Datei, auf die sich das eingehende Argument bezieht, automatisch öffnen und deren Inhalt anzeigen. Daher sollte diemain
Methode ungefähr so aussehen:Die
openFile
Methode ist eine Methode, die die Datei unter dem übergebenen Namen öffnet. Dieif
Anweisung stellt sicher, dassargs[0]
nur gelesen wird, wenn ein solches Argument vorliegt (VermeidungArrayIndexOutOfBoundsException
).args[0]
Im obigen Code wird nur das erste Argument verwendet. alle anderen Argumente (args[1]
,args[2]
usw.) werden ignoriert. DieopenFile
Methode wäre ungefähr so ( Deskriptoren und Rückgabetypen nicht enthalten ):Wenn in Ihrem Programm ein Open- Befehl in die GUI integriert ist, kann Ihre Anwendung, nachdem der Benutzer eine Datei mit diesem Befehl ausgewählt hat, dieselbe
openFile
Methode verwenden, um die ausgewählte Datei zu öffnen und ihren Inhalt anzuzeigen.Vorherige Antwort
Ich habe noch keine endgültige Antwort auf Ihr Problem , aber hier sind einige Tipps, um Ihnen den Einstieg zu erleichtern:
Haben Sie versucht, Anführungszeichen hinzuzufügen? So:
@="\"C:\\...\\run.exe\" \"%1\""
In der Registrierung wird der (Standard-) Wert folgendermaßen angezeigt:
"C:\...\run.exe" "%1"
Lesen Sie das offizielle MSDN-Dokument von Microsoft zur Dateitypzuordnung . Sie müssen sich auch über programmatische Kennungen informieren (die im ersten Absatz dieses Dokuments verlinkt sind).
Versuchen Sie zuerst, Ihren
.myext
Dateityp mit Notepad zu verknüpfen . Finden Sie heraus, wie Notepad mit.txt
Dateien verknüpft ist, und folgen Sie dem Beispiel. Bei korrekter Ausführung sollte Notepad Ihrefile.myext
Datei öffnen .Sie können herausfinden, wie Windows dies für Sie erledigt. Rechtsklick
file.myext
, klicken Sie auf Öffnen mit> Wählen Sie Standardprogramm ... ^ und Durchsuchen Sie Ihre findenrun.exe
Datei. Verknüpfen und öffnen Sie die Windows-Registrierung und untersuchen Sie sie, um herauszufinden, wie Windows Ihre manuelle Zuordnung gespeichert hat. Sie können dann einfach den Dateityp und die programmatische Kennung in Registrierungsdateien exportieren.^ Wenn
file.myext
keine Zuordnung besteht, klicken Sie auf Öffnen> Wählen Sie ein Programm aus einer Liste der installierten Programme aus .PS1: Offenbar Sie müssen doppelt Backslash in .reg - Dateien haben.
PS2: Es ist besser, Inhalte direkt in der Registrierung zu bearbeiten, die Effekte zu testen, dann die Schlüssel in REG-Dateien zu exportieren und sie zu einer einzigen Datei zu kombinieren, als selbst eine REG-Datei zu erstellen.
quelle
.myext
Datei doppelklicke. Wenn ich "Öffnen mit" und "Editor" auswähle, wird der Text angezeigt. Ich fange an zu denken, dass dies ein Problem mit meinem Code ist ..."%L"
anstelle von%1
.%L
Syntax, aber sie scheint unnötig ( Übergibt Windows nicht bereits lange Dateinamen mit%1
? Kurze 8.3-Namen sind bereits veraltet. Sie müssen nur sicherstellen, dass Sie umgebende Anführungszeichen haben.). @Mike Haben Sie versucht, eine Verbindung.myext
zu Windows Notepad herzustellen ? Wird die Datei dann korrekt geöffnet? Wenn ja, liegt das Problem in Ihrem Java-Code. Darf ich jedoch fragen, was genau Siemjar.jar
mit der Datei machen, die mit dem an sie übergeben wird"%1"
?Ihr Problem ist, wie Sie den
start
Befehl verwenden.Indem Sie den ersten Parameter
""
eingeben, weisen Sie diesen als Titel des Fensters für das gestartete Programm zu. Dann gehen%1
Sie hinein (was Sie in den Kommentaren Ihrer Frage notiert haben).%1
ist der Dateiname der.myext
Datei, auf die Sie geklickt haben. So , dass ist die Dateistart
versucht auszuführen.Was zu dem Fehler führt, den Sie sehen.
Um es zu lösen, verwenden Sie einfach Folgendes
start
:Es wird erwartet, dass der erste übergebene Parameter, an
start
den eingeschlossen""
ist, der Titel des resultierenden (Konsolen-) Fensters ist.Es
/
wird erwartet, dass der zweite Parameter (der nicht mit a beginnt ) die ausführbare Datei ist , die gestartet werden soll. Wenn der Pfad dazu Leerzeichen enthält, muss er eingeschlossen werden""
. Andernfalls sind sie optional.Der dritte und alle folgenden Parameter werden an die ausführbare Datei übergeben.
Diese müssen also nicht
""
separat beigefügt werden. Aber Sie tun müssen , um enclose Pfade (die Leerzeichen enthalten) in den Parametern in""
so dass die ausführbare sie richtig analysieren kann , wenn gestartet.quelle
Windows cannot find 'C:\...\javaw.exe -jar'. Make sure you typed the name correctly, and then try again.
Nur um sicherzugehen,"something"
ist der Titel des Fensters richtig?"
meine Antwort möglicherweise falsch platziert ist . Wird es jetzt beheben.Problem
Sie haben Ihren Befehl wie folgt eingestellt:
Leerzeichen sind Trennzeichen und werden verwendet, um verschiedene Teile eines Befehls und seine Argumente zu trennen. Wenn Sie keine Leerzeichen in den Dateinamen hätten, würde es funktionieren:
Wenn Leerzeichen in der Datei (oder ihrem Pfad) übergeben werden, funktioniert das Programm möglicherweise oder möglicherweise ordnungsgemäß, je nachdem, wie es seine Argumente interpretiert:
Ist
C:\My
Argument eins undDocs\test.myext
Argument zwei? Sind alle Argumente eine einzige Zeichenfolge? Gibt es eine spezielle Interpretation?Wenn Ihr Programm (oder sein Pfad) Leerzeichen enthält, kann Windows nicht erkennen, welche Teile der Pfad und / oder der Dateiname sind und welche Teile andere Argumente sind:
Windows versucht , die Datei auszuführen
C:\Program
und übergibtFiles\Foobar\run.exe
undC:\test.myext
als Argument zu.Wie Sie sehen können, ist dies eindeutig kein gültiger Dateiname. Wenn Sie es im Dialogfeld "Ausführen" eingegeben haben, wird die gleiche Fehlermeldung " App kann nicht gefunden / nicht gültig" angezeigt .
Lösung
Was Sie tun müssen, ist, Datei- / Pfadnamen in Anführungszeichen zu setzen, um zu verdeutlichen, dass es sich um eine einzelne Einheit handelt. Dies ist normalerweise unkompliziert, aber nicht immer.
In Ihrem Fall sollte es ziemlich einfach sein. Wenn Sie es direkt in Regedit eingeben, verwenden Sie dies (ersetzen Sie die Pfade nach Bedarf). Navigieren Sie zu
HKCR\myext\shell\open\command
dem Standardelement, bearbeiten Sie es und setzen Sie es auf:Wenn Sie es in eine
.REG
Datei einfügen, verwenden Sie Folgendes:Beachten Sie, wie die Schrägstriche und Anführungszeichen (mit einem Schrägstrich) maskiert werden, aber sowohl das Programm als auch das Dateiargument in Anführungszeichen gesetzt werden. Dies ist unabhängig davon, ob der Pfad / Dateiname Leerzeichen enthält. es ist nur sicherer.
Sie können aber auch das Ersetzen
%1
mit%L
zu übergeben Sie den vollständigen Pfad zur Datei sollte Ihr Programm erfordern.quelle
EXE
Art ein. Aus Ihren Antworten geht hervor, dass Sie eine ausführbare Datei wie Notepad erfolgreich verwenden und Ihre Roh-Batch-Datei erfolgreich verwenden können. Das Problem tritt nur auf, wenn Sie die kompilierte Batchdatei verwenden. (Sie haben gesagt, dass die kompilierte Batch-Datei korrekt ausgeführt wird, wenn Sie sie manuell ausführen, oder?) Das macht sie ziemlich verwirrend. Wenn die ausführbare Datei nicht beschädigt ist und tatsächlich funktioniert, wenn sie manuell ausgeführt wird, und der von Ihnen erstellte Kontextmenüpunkt mit anderen Programmen funktioniert, warum funktioniert die kompilierte Batchdatei dann nicht über das Menü? Es wird kein DDE verwendet, oder?EXE
Datei wird den Dateinamen korrekt erhalten und anzeigen. (Ich bin mir ziemlich sicher, dass der Dateiinhalt auch angezeigt wird, wenn ich einenmore
Befehl eingefügt hätte.) Bis @Mike bestätigt, dass seine.jar
Datei die eingehende Datei korrekt verarbeiten kann, können wir die Problemquelle nicht richtig eingrenzen . (Er hat das in seinem Kommentar hier nicht getan und meine Frage noch nicht beantwortet!)