7 votes

"file.myext" n'est pas une application Win32 valide

J'ai écrit une clé de registre qui crée .myext.

Double-cliquer sur mon fichier.myext fait référence à mon fichier exécutable (converti à partir d'un fichier batch qui ouvre un .jar) qui ouvre ensuite mon application de bloc-notes.


Le registre

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"

Mon exécutable (run.exe) qui a été converti à partir d'un fichier batch

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

Problème ?

Je ne sais pas pourquoi je reçois ce message d'erreur. Peut-être que c'était cette application de conversion qui pose quelques problèmes.


SUGGESTIONS

Voici ce que j'ai fait après les suggestions de tout le monde. Je suis capable d'ouvrir avec succès mon éditeur de texte (avec l'une des suggestions suivantes) après avoir cliqué sur un document, mais aucun texte n'apparaît dans le JTextPane. Si je choisis d'ouvrir le document dans le Bloc-notes Windows, tout le texte s'affiche.

P.S. Je n'utilise pas DDE et je ne reçois plus le message d'erreur : "file.myext" n'est pas une application Win32 valide.

SUGGESTIONS DE FICHIER BATCH

start "Éditeur de texte de Mike" /min "C:\...\javaw.exe" -jar "C:\...\mjar.jar"

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

SUGGESTION DE REGISTRE

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

4voto

diegogs Points 624

Votre problème réside dans la façon dont vous utilisez la commande start.

En mettant le premier paramètre dans "", vous attribuez cela comme le titre de la fenêtre du programme démarré. Ensuite, vous passez %1 dedans (comme vous l'avez noté dans les commentaires de votre question). %1 est le nom de fichier du fichier .myext sur lequel vous avez cliqué. Donc cela est le fichier que start essaye d'exécuter.

Ce qui conduit à l'erreur que vous voyez.

Donc, pour le résoudre, utilisez simplement start comme ceci:

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

Le premier paramètre passé à start, qui est encadré de "", est censé être le titre de la fenêtre (console) résultante.

Le deuxième paramètre (qui ne commence pas par un /) est censé être l'exécutable à démarrer. Si le chemin contient des espaces, il doit être encadré de "". Sinon, c'est optionnel.

Les troisième et tous les paramètres suivants seront transmis à l'exécutable.
Donc, ceux-ci n'ont pas besoin d'être encadrés séparément de "". Mais vous devez encadrer les chemins (qui contiennent des espaces) dans ces paramètres de "" pour que l'exécutable puisse les interpréter correctement lorsqu'il est démarré.

2voto

Ben Collins Points 11318

Problème

Vous avez votre commande configurée de la manière suivante :

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

Les espaces sont des délimiteurs et sont utilisés pour séparer les différentes parties d'une commande et de ses arguments. Si vous n'aviez pas d'espaces dans les noms de fichiers, ça fonctionnerait :

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

Si vous avez des espaces dans le nom du fichier (ou de son chemin), le programme peut fonctionner correctement ou non en fonction de la façon dont il interprète ses arguments :

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

Est-ce que C:\My est un argument et Docs\test.myext est le deuxième argument ? Tous les arguments sont-ils une seule chaîne de caractères ? Y a-t-il une interprétation spéciale ?

Si vous avez des espaces dans votre programme (ou dans son chemin), alors Windows ne pourra pas identifier quelles parties sont le chemin et/ou le nom du fichier, et quelles parties sont les autres arguments :

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

Windows essaie d'exécuter le fichier C:\Program et de passer Files\Foobar\run.exe et C:\test.myext en tant qu'arguments.

Comme vous pouvez le voir, ce n'est clairement pas un nom de fichier valide. Si vous le saisissiez dans la boîte de dialogue Exécuter, vous obtiendriez le même message d'erreur application non trouvée/non valide.

Solution

Ce que vous devez faire est d'entourer les noms de fichier/chemin entre guillemets pour indiquer qu'ils forment une seule unité. C'est généralement simple, mais pas toujours.

Dans votre cas, cela devrait être assez facile. Si vous le saisissez directement dans Regedit, utilisez ceci (en remplaçant les chemins si nécessaire). Naviguez jusqu'à HKCR\myext\shell\open\command et modifiez l'élément par défaut pour le définir comme suit :

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

Si vous le mettez dans un fichier .REG, utilisez ceci :

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

Remarquez comment les barres obliques inverses et les guillemets sont échappés (avec une barre oblique inverses), mais à la fois le programme et l'argument du fichier sont entre guillemets. C'est recommandé indépendamment de la présence d'espaces dans le chemin/le nom de fichier ; c'est juste plus sûr.

De plus, vous pouvez remplacer %1 par %L pour transmettre le chemin d'accès complet au fichier si votre programme en a besoin.

1voto

ADTC Points 2859

Nouvelle réponse

C'est le strict minimum dont vous avez besoin pour associer correctement. J'ai découvert cela en essayant mon propre conseil numéro 4 ci-dessous (Vous pouvez découvrir comment Windows le fait pour vous...).

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.myext]
@="myext"

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

[HKEY_CLASSES_ROOT\myext\shell]

[HKEY_CLASSES_ROOT\myext\shell\open]

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

Vous pouvez ajouter DefaultIcon et d'autres éléments si nécessaire, mais sans DefaultIcon, Windows utilisera simplement l'icône dans run.exe (s'il en a une. Vous pouvez en ajouter une dans le Convertisseur Batch vers Exécutable lorsque vous créez le run.exe).

Importance de %1 et des guillemets

La raison pour laquelle vous devez mettre un %1 là-bas est de transmettre le chemin et le nom du fichier associé (fichier.myext) dans le programme run.exe. Sans transmettre cela, votre association est inutile car elle fonctionne simplement comme un raccourci. Ceci est inutile car vous pouvez simplement créer un raccourci normal vers run.exe pour servir le même but.

Votre fichier Batch doit aussi avoir un %1 quelque part à l'intérieur afin que le chemin et le nom du fichier associé (fichier.myext) soient utilisés à l'intérieur du fichier Batch (probablement pour le passer à votre mjar.jar qui fera quelque chose avec le fichier). Sinon, peu importe sur quel fichier associé vous double-cliquez, vous obtiendrez toujours le même résultat de votre programme Java. Ceci est encore une fois inutile car vous pouvez simplement avoir un raccourci vers le fichier Batch pour servir le même but.

Il est également important d'encadrer le %1 entre guillemets, car les chemins de fichiers peuvent contenir des espaces, et sans les guillemets (") ces espaces peuvent diviser le chemin en deux arguments ou plus (lorsque le chemin entier est censé être considéré comme un seul argument).

Exemple de fichier Batch

Voici le fichier Batch que j'ai converti en exe pour le test. Il affiche simplement la valeur de %1.

@echo %1
@pause

Votre fichier Batch pourrait être comme le suivant (pour que mjar.jar puisse obtenir le chemin et le nom du fichier sur lequel vous double-cliquez) :

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

J'ai associé le fichier exe avec l'extension .myext (en utilisant la méthode de mon conseil 4) puis vérifié le registre pour créer le fichier .reg ci-dessus. Lorsque je double-clique sur un fichier avec l'extension .myext, une fenêtre de commande s'ouvre, affichant (echo commande) le chemin et le nom du fichier sur lequel j'ai double-cliqué (c'est ainsi que mon fichier batch de test est utilisant le fichier associé).

Programme Java

(Ceci est un résumé de la discussion complète en ligne qui a finalement résolu votre problème.) Votre programme Java contenu dans mjar.jar doit être préparé pour accepter l'argument entrant et l'utiliser. Votre intention est que votre programme ouvre automatiquement le fichier référencé par l'argument entrant et affiche son contenu. Par conséquent, la méthode main devrait ressembler à ceci :

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

La méthode openFile est une méthode qui ouvre le fichier par le nom qui lui est transmis. L'instruction if garantit que args[0] n'est lu que lorsqu'il y a un tel argument (évitant ArrayIndexOutOfBoundsException). Seul le premier argument args[0] est utilisé dans le code ci-dessus ; tous les autres arguments (args[1], args[2], etc.) sont ignorés. La méthode openFile ressemblerait à ceci (descripteurs et types de retour non inclus) :

openFile(String filename) {
    // code ici pour ouvrir le fichier référencé par la variable "filename",
    // lire son contenu et l'afficher sur l'interface graphique
    // ou l'utiliser dans le programme comme prévu
}

Si votre programme a une commande Ouvrir intégrée dans son interface graphique, après que l'utilisateur a choisi un fichier avec cette commande, votre application peut utiliser la même méthode openFile ci-dessus pour ouvrir le fichier choisi et afficher son contenu.

Ancienne réponse

Je n'ai pas de réponse définitive à votre problème pour l'instant, mais voici quelques conseils pour vous aider à démarrer :

  • Avez-vous essayé d'ajouter des guillemets ? Comme ceci : @="\"C:\\...\\run.exe\" \"%1\""
    Dans le registre, la valeur (Par défaut) apparaîtra ainsi : "C:\...\run.exe" "%1"

  • Lisez la documentation officielle de Microsoft sur l'Association de Type de Fichier. Vous devrez également vous renseigner sur les Identificateurs Programmatiques (liés dans le premier paragraphe de ce document).

  • Essayez d'associer votre type de fichier .myext avec le Bloc-notes en premier. Découvrez comment le Bloc-notes est associé aux fichiers .txt et suivez l'exemple. Si c'est fait correctement, le Bloc-notes devrait ouvrir votre fichier fichier.myext.

  • Vous pouvez découvrir comment Windows le fait pour vous. Cliquez avec le bouton droit sur fichier.myext, cliquez sur Ouvrir avec > Choisir le programme par défaut...^ et Parcourir pour trouver votre fichier run.exe. Associez et ouvrez, puis examinez le registre Windows pour découvrir comment Windows a enregistré votre association manuelle. Vous pouvez ensuite simplement exporter le type de fichier et l'identificateur programmatique vers des fichiers reg.

^ Si fichier.myext n'est pas associé, cliquez sur Ouvrir > Sélectionner un programme dans une liste de programmes installés.

PS1 : Apparemment, il doit y avoir un double antislash dans les fichiers .reg.
PS2 : Il vaut mieux éditer directement les éléments dans le registre, tester les effets, puis exporter les clés vers des fichiers .reg et les combiner en un seul fichier, plutôt que de créer un fichier .reg vous-même.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X