"File.myext" ist keine gültige Win32-Anwendung

7

Ich habe eine Registrierung geschrieben, die erstellt .myext.

Ein Doppelklick auf my file.myextbezieht 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 angezeigt JTextPane. 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\""
rauben
quelle
Haben Sie brauchen es sich um eine ausführbare Datei anstelle einer Batch - Datei zu sein? Haben Sie versucht, die ausführbare Datei selbst auszuführen? Haben Sie versucht, die Batchdatei im commandSchlüssel zu verwenden, um festzustellen, ob dies funktioniert?
Synetech
@ Synetech Ja. Die ausführbare Datei funktioniert eigenständig und verwendet die Batchdatei im commandSchlüssel. Die Fehlermeldung wird angezeigt, wenn ich auf meine Datei doppelklicke, die mit meiner Java-Anwendung gespeichert wurde.
Rob
1
Vergessen , dies zu fragen, wie funktioniert Ihre run.exe Nutzung der file.myextoder was auch immer Datei mit ihm verbunden? Ich finde keine %1in Ihrem Batch-Skript, die zur Übergabe von Argumenten erforderlich sind ( file.myextin diesem Fall).
ADTC
1
Funktioniert das auch start "" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar" %1? Es sollte .
Synetech
1
Um ehrlich zu sein, ist nicht wirklich klar, was los ist. Was genau sind die .myextDateien und was genau ist mjar.jar? Ist mjar.jarein Tet-Editor und .myextDateien sind Textdateien? Versuchen Sie, einen neuen Textdateityp zu erstellen, der mit einem Java-Texteditor geöffnet wird?
Synetech

Antworten:

1

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 ... ).

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\""

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 erstellen run.exe.

Bedeutung %1und Anführungszeichen

Der Grund, warum Sie ein %1dort einfügen müssen, besteht darin, den Pfad und den Namen der zugehörigen Datei ( file.myext) an das Programm zu übergeben run.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önnen run.exe, um denselben Zweck zu erfüllen.

Ihre Batch - Datei sollte auch eine hat %1irgendwo 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 Ihren mjar.jardenen 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 %1Anfü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 exeTesten konvertiert habe . Es wird einfach angezeigt, was auch immer der Wert von %1ist.

@echo %1
@pause

Ihre Batch-Datei könnte wie mjar.jarfolgt aussehen (damit Sie den Pfad und den Namen der Datei erhalten, auf die Sie doppelklicken):

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

Ich habe die exeDatei mit der .myextErweiterung verknüpft (mithilfe der Methode in Tipp 4) und dann die Registrierung überprüft, um die obige .regDatei zu erstellen . Wenn ich einen Doppelklick auf eine Datei mit .myextErweiterung, öffnet sich ein Befehlsfenster angezeigt wird ( echoBefehl) , 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.jarmuss 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 die mainMethode ungefähr so ​​aussehen:

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

Die openFileMethode ist eine Methode, die die Datei unter dem übergebenen Namen öffnet. Die ifAnweisung stellt sicher, dass args[0]nur gelesen wird, wenn ein solches Argument vorliegt (Vermeidung ArrayIndexOutOfBoundsException). args[0]Im obigen Code wird nur das erste Argument verwendet. alle anderen Argumente ( args[1], args[2]usw.) werden ignoriert. Die openFileMethode wäre ungefähr so ​​( Deskriptoren und Rückgabetypen nicht enthalten ):

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
}

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 openFileMethode 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 .myextDateityp mit Notepad zu verknüpfen . Finden Sie heraus, wie Notepad mit .txtDateien verknüpft ist, und folgen Sie dem Beispiel. Bei korrekter Ausführung sollte Notepad Ihre file.myextDatei ö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 finden run.exeDatei. 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.myextkeine 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.

ADTC
quelle
Hervorragende Antwort. Ich habe versucht, an zahlreichen Stellen Anführungszeichen hinzuzufügen (genau wie Ihr Vorschlag), aber es hat nie richtig funktioniert. Vielen Dank für den Link! Ich habe darüber gelesen und es scheint ziemlich hilfreich zu sein.
Rob
@ Mike Ich habe die Antwort aktualisiert. Bitte suchen Sie nach einer neuen Antwort über der vorherigen.
ADTC
Vielen Dank für die Erklärung, warum es wichtig ist,% 1 zu haben. Ich hatte die Vermutung, dass es zum Referenzieren oder Übergeben einer Variablen verwendet wurde. Auf jeden Fall habe ich meine Registrierung mit Ihren Vorschlägen geschrieben und es hat einwandfrei funktioniert. Das einzige Problem, das weiterhin besteht, ist die Tatsache, dass in meiner Notizblockanwendung kein Text angezeigt wird, wenn ich auf eine .myextDatei 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 ...
Rob
> Das einzige Problem, das weiterhin besteht, ist die Tatsache, dass in meiner Editor-Anwendung kein Text angezeigt wird, wenn ich auf eine .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. @ Mike, du hast gesagt, es funktioniert, wenn du es manuell machst, also sollte es nicht so sein. Das Problem bleibt, dass die (richtige) Datei nicht geöffnet wird. Versuchen Sie es mit "%L"anstelle von %1.
Synetech
@Synetech entschuldigt, es gibt eine %LSyntax, 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 .myextzu 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 Sie mjar.jarmit der Datei machen, die mit dem an sie übergeben wird "%1"?
ADTC
4

Ihr Problem ist, wie Sie den startBefehl verwenden.

Indem Sie den ersten Parameter ""eingeben, weisen Sie diesen als Titel des Fensters für das gestartete Programm zu. Dann gehen %1Sie hinein (was Sie in den Kommentaren Ihrer Frage notiert haben). %1ist der Dateiname der .myextDatei, auf die Sie geklickt haben. So , dass ist die Datei startversucht auszuführen.

Was zu dem Fehler führt, den Sie sehen.

Um es zu lösen, verwenden Sie einfach Folgendes start:

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

Es wird erwartet, dass der erste übergebene Parameter, an startden 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.

Der Hochstapler
quelle
1
+1, klingt sehr wahrscheinlich. Das hat mich mindestens zweimal gebissen, und trotzdem habe ich es im OP nicht gesehen ...
Jonas Heidelberg
Ich habe Ihren Vorschlag ausprobiert und eine Fehlermeldung erhalten: 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?
Rob
Ja, "etwas" der Titel des Fensters. Ich denke, dass "meine Antwort möglicherweise falsch platziert ist . Wird es jetzt beheben.
Der Hochstapler
Die Anwendung wird ordnungsgemäß geöffnet, der Textbereich ist jedoch noch leer. PS Die Batch-Datei verwendet kein DDE.
Rob
1
Bitte geben Sie den genauen Inhalt Ihrer Batch-Datei in Ihre Frage ein. Ich weiß auch nichts über den Textbereich. Bitte geben Sie alle relevanten Informationen aus Kommentaren in Ihre Frage ein.
Der Hochstapler
2

Problem

Sie haben Ihren Befehl wie folgt eingestellt:

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

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:

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

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:

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

Ist C:\MyArgument eins und Docs\test.myextArgument 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:

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

Windows versucht , die Datei auszuführen C:\Programund übergibt Files\Foobar\run.exeund C:\test.myextals 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\commanddem Standardelement, bearbeiten Sie es und setzen Sie es auf:

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

Wenn Sie es in eine .REGDatei einfügen, verwenden Sie Folgendes:

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

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 %1mit %Lzu übergeben Sie den vollständigen Pfad zur Datei sollte Ihr Programm erfordern.

Synetech
quelle
Ich möchte mich dafür entschuldigen, dass ich nicht früher auf Sie zurückkomme, aber ich möchte mich auch bei Ihnen für die sehr sachkundigen Informationen bedanken. Ich habe meinen gesamten Code aktualisiert und mit ADTC und Ihren Vorschlägen verglichen, habe jedoch weiterhin Probleme beim Anzeigen des Textes in meiner Anwendung (keine Probleme beim Öffnen der Datei mit Windows Notepad).
Rob
Es schränkt das Problem auf die kompilierte EXEArt 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?
Synetech
@Synetech // Warum funktioniert die kompilierte Batchdatei nicht über das Menü? Es wird kein DDE verwendet, oder? // In meinem Test hat dieser Teil absolut gut funktioniert. Ich könnte den Kontextmenüpunkt ausführen und die kompilierte EXEDatei wird den Dateinamen korrekt erhalten und anzeigen. (Ich bin mir ziemlich sicher, dass der Dateiinhalt auch angezeigt wird, wenn ich einen moreBefehl eingefügt hätte.) Bis @Mike bestätigt, dass seine .jarDatei 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!)
ADTC
@Synetech und Mike Bitte treten Sie dem Chatraum bei, den ich für dieses Thema erstellt habe. Vielen Dank! Diese Diskussion mit Kommentaren hier und da wird sehr lang und unorganisiert, und die Wartezeiten sind sehr anstrengend.
ADTC