# Datei öffnen mit . jar



## The_S (25. Nov 2006)

Hi,

ist es möglich unter Windows einzustellen, dass ein bestimmter Datentyp immer mit einer bestimmten JAR geöffnet werden soll (ich denke mal, die Datei wird als Parameter übegeben!?)? Wenn ich das über den "Öffnen Mit" Dialog versuche bekomm ich die Meldung, dass die zu öffnende Datei keine gültige Win32 Anwendung ist. Ich denke mal das liegt daran, dass Windows eine JAR nicht als Programm ansieht und ich das JAR-File als Anwendung auch nur auswählen kann, wenn ich den Filter von "Programme" auf "Alle Dateien" ändere.

danke!


----------



## stev.glasow (25. Nov 2006)

Bau dir einfach ne bat oder ne exe die die jar startet.
Und die gibst du dann bei "öffnen mit ..." an.


----------



## SlaterB (25. Nov 2006)

hast du es schon mit den Windows-Verknüpfungen probiert?
Verknüpfung auf 'java -jar ..', öffnen mit Verknüpfung?


----------



## The_S (25. Nov 2006)

@stevg wie stell ichs bei ner bat an, dass die übergebenen Parameter an den Aufruf mit übergeben werden?

@SlaterB hatte ich nicht, aber bei einem Versuch kommt die selbe Meldung


----------



## stev.glasow (25. Nov 2006)

%1 oder $1 oder so ähnlich. die Anzahl bekommst bestimmt auch irgendwie raus. Frag mal google   :###


----------



## stev.glasow (25. Nov 2006)

Könnte aber sein, das du unbedingt ne exe brauchst.
http://www.marochess.de/chess/tools/jlaunch/


----------



## The_S (25. Nov 2006)

stevg hat gesagt.:
			
		

> Könnte aber sein, das du unbedingt ne exe brauchst.
> http://www.marochess.de/chess/tools/jlaunch/



Danke, das schaut doch schonmal gut aus. Werds mir bei Gelgenheit mal anschauen


----------



## Illuvatar (26. Nov 2006)

Zu dem Ergebnis auf dem Screenshot http://home.arcor.de/sidiousx/filetype.jpg

kommt man per JDIC mit folgendem Code (nur Windows ):

```
AssociationService as = new AssociationService();
			File startbat = new File ("JMind.bat");
			BufferedWriter bw = new BufferedWriter (new FileWriter (startbat));
			File chosen = new File (System.getProperty("user.dir"));
			bw.write("@echo off");
			bw.newLine();
			bw.write(chosen.getAbsolutePath().substring(0, 2));
			bw.newLine();
			bw.write("cd " + chosen.getAbsolutePath());
			bw.newLine();
			String javahome = System.getProperty("java.home", "");
			String filesep = File.separator;
			bw.write ("START " + javahome + filesep + "bin" + filesep + "javaw.exe -jar jMindMap3D.jar " + ((args.length != 0 && args[0].equals("-debug")) ? "-debug" : "") + "%1");
			bw.close();
			Association jm3 = new Association ();
			jm3.addFileExtension ("jm3");
			org.jdesktop.jdic.filetypes.Action jm3Action = new org.jdesktop.jdic.filetypes.Action ("open", startbat.getAbsolutePath() + " \"%1\"", "Open jMindMap3D");
			jm3.addAction (jm3Action);
			InputStream is = ClassLoader.getSystemResourceAsStream("icon.ico");
			OutputStream os = new FileOutputStream ("jMindMapIcon.ico");
			byte[] buf = new byte[512];
			int len;
			while ((len = is.read(buf)) >= 0){
				os.write(buf, 0, len);
			}
			is.close();
			os.close();
			jm3.setIconFileName (new File ("jMindMapIcon.ico").getAbsolutePath());
			as.registerSystemAssociation (jm3);
```


----------



## thE_29 (27. Nov 2006)

Oder aber auch!

Explorer öffnen!

Extras->Ordneroptionen->Dateitypen

Gewünschten Dateityp auswählen oder neu erstellen!

Dann auf Erweitert!

Dort Neu und Namen geben für Aktion (Öffnen als bsp)

Als Programm zB das eingeben:

C:\Programme\Java\jdk1.5.0_06\jre\bin\java.exe -jar C:\Programm.jar %1


Natürlich müssen die Pfade angepasst werden, aber so geht das!


----------



## The_S (27. Nov 2006)

@thE_29 Das erscheint mir als beste und einfachste Möglichkeit. Werd ich daheim gleich mal ausprobieren  danke!


----------



## thE_29 (27. Nov 2006)

Ich schreibe dir gerade ne nette Funktion 

brb!


----------



## thE_29 (27. Nov 2006)

```
/****************************************************************************************************************************
     * Methode registriert eine Dateiendung mit einem java programm
     * Also die Dateiendung ruft implizit eine .jar Datei auf mit der eigentlichen Datei als 1ten Übergabeparameter
     * @param file_end_suffix String Dateindung von dem neuen Typen (ohne .)
     * @param path_to_java_program String Java Programm das via java -jar programm.jar aufgerufen wird
     * @param optional_icon String optionales Bild was bei der neuen Dateiendung gesetzt werden kann 
     * ACHTUNG Damit das Bild angezeigt wird, muss entweder der PC neugestartet werden oder der explorer neu gestartet werden
     * @throws FileNotFoundException wenn der Java Interpreter nicht gefunden wurde, das jar File oder das Icon (wenn nicht null)
     ***************************************************************************************************************************/
    public static void registerJavaProgram(String file_end_suffix, String path_to_java_program, String optional_icon) throws FileNotFoundException
    {
      if(file_end_suffix == null)
        throw new NullPointerException("Suffix cannot be null");
      if(file_end_suffix.startsWith("."))
        throw new IllegalArgumentException("Suffix has to be declared without leading point (for example: xyz and not .xyz)\nYours: " + file_end_suffix);
      if(path_to_java_program == null)
        throw new NullPointerException("Java program cannot be null");
      if(!path_to_java_program.endsWith(".jar"))
        throw new IllegalArgumentException("Java programm must be a jar file: " + path_to_java_program);
      if(!new File(path_to_java_program).exists())
        throw new FileNotFoundException("Java programm cannot be found at: " + path_to_java_program); 
      if(optional_icon != null && !new File(optional_icon).exists())
        throw new FileNotFoundException("Icon cannot be found at: " + optional_icon);
      String _home = System.getProperty("java.home");
      if(!_home.endsWith(File.separator))
        _home = _home.concat(File.separator); //hängt einen backslash hinten dazu
      _home = _home.concat("bin" + File.separator + "java.exe"); //hier javaw.exe reinschreiben, wenn die gewünscht ist
      if(!new File(_home).exists())
        throw new FileNotFoundException("java interpreter not found at: " + _home);
      String HCR = "[HKEY_CLASSES_ROOT\\.";
      //dadurch das replaceAll mit regex arbeitet und einmal \\ == \ im string müssen wir \\\\ für 2 \\ das regex kapiert, das ich einen backslash meine
      _home = _home.replaceAll("\\\\","\\\\\\\\"); //alle \ gehören durch doppelte \\ ersetzt
      path_to_java_program = path_to_java_program.replaceAll("\\\\","\\\\\\\\");
      if(optional_icon != null)
        optional_icon = optional_icon.replaceAll("\\\\","\\\\\\\\"); //auch hier alle Backslashes durch doppelte ersetzen
      try{
        File exFile = File.createTempFile("progregister",".tmp");
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(exFile)));
        bw.write("Windows Registry Editor Version 5.00");
        bw.newLine();
        bw.newLine();
        bw.write(new StringBuffer(HCR).append(file_end_suffix).append("]").toString());
        bw.newLine();
        bw.newLine();
        bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\Shell]").toString());
        bw.newLine();
        bw.newLine();
        bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\Shell\\Open]").toString());
        bw.newLine();
        bw.newLine();
        bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\Shell\\Open\\Command]").toString());        
        bw.newLine();
        bw.write(new StringBuffer("@=\"").append(_home).append(" -jar ").append(path_to_java_program).append(" %1 \"").toString());
        if(optional_icon != null)
        {
          bw.newLine();
          bw.newLine();
          bw.write(new StringBuffer(HCR).append(file_end_suffix).append("\\DefaultIcon]").toString());
          bw.newLine();
          bw.write(new StringBuffer("@=\"").append(optional_icon).append("\"").toString());
        }
        bw.flush();
        bw.close(); //schließt das File
        Runtime.getRuntime().exec("regedit /s " + exFile.getAbsolutePath()).waitFor(); //speichert den Eintrag in der registry
        if(!exFile.delete())
          exFile.deleteOnExit();
      }
      catch(Exception ex)
      {
        ex.printStackTrace();
      }
    }
```

Problem gibts nur beim Icon..

Man muss irgendwie den Explorer refreshen, aber wie das geht ohne das ich ihn abwürge weiß ich nicht...


----------



## The_S (27. Nov 2006)

Nicht schlecht ... Eigentlich sogar absolut genial  . Herzlichen Dank, werds daheim gleich mal ausprobieren. Mit welcher Windows-Version hast du das getestet?

Theoretisch liese sich auf diesem Weg zumindest unter Windows ein Starter-File MIT Icon (und sehr kryptischer Dateiendung, aber immerhin) generieren ...


----------



## thE_29 (27. Nov 2006)

Habs mit WindowsXP getestet! Kanns aber auch unter Win2k testen!

Sollte IMHO gleich sein, außer das vielleicht Windows Registry Editor Version 5.00 hier ein 4.00 gehört!

Oder war das NT? (Fragen über Fragen)

Mache sowas schon seit Jahren so und klappt immer so  Man glaubt gar net alles was man in der registry alles rumstellen kann!
(Man sollte aber net rumpfuschen wenn man net weiß, was man tut)




PS.: wenn du die java Box net haben willst, musst halt javaw.exe statt java.exe bei _home dazuhängen!


----------



## The_S (27. Nov 2006)

teste mal bitte unter Windows 2000 wenn du Zeit hast. Da kann ich das nämlich leider nicht testen. Danke. Frühere Versionen benötige ich nicht.



			
				thE_29 hat gesagt.:
			
		

> (Man sollte aber net rumpfuschen wenn man net weiß, was man tut)



Deswegen lass ich die Finger von der Registry


----------



## The_S (27. Nov 2006)

Hm, kann man auch irgendwie definieren, dass n-Parameter mit übergeben werden können?


----------



## thE_29 (27. Nov 2006)

Also, es läuft auch unter Win2k!

Wie welche Parameter?!


----------



## The_S (27. Nov 2006)

Wenn ich mehrere Dateien gleichzeitig übergeben möchte bzw öffne. Z. B. mehrere Bilder. Oder geht das schon? Dieser Satz macht mich nur ein bisschen stutzig



> Also die Dateiendung ruft implizit eine .jar Datei auf mit der eigentlichen Datei als 1ten Übergabeparameter



...


----------



## thE_29 (27. Nov 2006)

Ahaa.... Also wenn du 10 Files aufeinmal aufmachst?

Da wird leider jedes mal das aufgerufen!

Das etwas nur 1mal aufgemacht wird, wenn man 10 Dinger aufeinmal anklickt ist vom Programm so geregelt!

Mach mal 10 jar Dateien auf.. Werden auch alle geöffnet und net nur 1 JVM!


----------



## The_S (27. Nov 2006)

Hm ok. Dann müsste ich mir da Programm-Seitig was überlegen. Werd schon ne Möglichkeit irgendwie finden (hoff ich  ).

Aber aufjedenfall nochmal n großes Danke :toll:


----------



## The_S (27. Nov 2006)

Hm, irgendwie will das nicht so ganz ... mein Aufruf schaut so aus


```
try {
			registerJavaProgram("SCP", "D:\\SoundController\\SoundController.jar", "D:\\SoundController\\Player2.gif");
		}
		catch (Exception e) {
			e.printStackTrace();
		}
```

Beim Doppelklick auf eine .scp Datei erhalte ich folgende Fehlermeldung 



> Invalid or Corrupt jarfile C:\test.SCP



Die Klasse die beim Aufrufen des Jar-Files aufgerufen wird sieht so aus


```
public class StartUp {
	
	public static void main(String[] args) {
		
		SoundController sc = new SoundController();
		sc.loadApplication(args.length < 1);
		if (args.length > 0) {
			if (args[0].toUpperCase().endsWith(".SCP")) {
				sc.notifyModel(new ViewChangedEvent(null, args[0], MySoundConstants.LOAD_PLAYLIST));
			}
		}
	}
}
```

Windows Version ist



> Microsoft Windows XP [Version 5.1.2600]
> Service Pack 2



Woran könnte das liegen? Danke!


----------



## thE_29 (27. Nov 2006)

Gehe mal in die registry (start->ausführen->regedit)

Und zu dem Eintrag
HKEY_CLASSES_ROOT\.SCP und kopier mal alles was da steht!

+ Unterverzeichnisse oder mach einen Screenshot wenn alles aufgeklappt ist + dem Command Tree (defaulticon is net so wichtig)

Hat es den das Icon?

Und wo kommt der Fehler? Ist das von java oder windows?


----------



## The_S (27. Nov 2006)

Direkt unter .SCP

Standard, REG_SZ, ft000001

Unter Default Icon

Standard, REG_SZ, D:\SoundController\Player2.gif

Unter Shell => Open => Command (Die Schlüssel in Shell und Open sind die Werte nicht gesetzt)

Standard, REG_SZ, C:\Programme\Java\jre1.5.0_08\bin\java.exe -jar D:\SoundController\SoundController.jar %1

Das Icon wird auch nicht angezeigt, wobei könnt daran liegen, dass ich ein gif zugewiesen hab 

Der Fehler sollte Java-basiert sein.


----------



## thE_29 (27. Nov 2006)

Du hast diese Endung schonmal unterm Explorer eingetragen!

Der Standard Eintrag darf auch nichts zeigen (rechtsklick schlüssel löschen)

Bei dir zeigt der auf ft00001, was (wenn du in der registry suchst) du sicher finden wirst!


----------



## The_S (28. Nov 2006)

OK, danke. Das heißt also ich schmeiß den Schlüssel raus und versuch dann das ganze nochmal!?


----------



## thE_29 (28. Nov 2006)

Genau!
Kannst du es jetzt nicht ausprobieren?

Nur zu Testzwecken?


----------



## The_S (28. Nov 2006)

Ne, erst wieder daheim. Ich hab hier keinen Zugriff auf Arbeit keinen Zugriff auf die Registry :cry: . Ich meld mich aber heute Abend nochmal.


----------



## The_S (28. Nov 2006)

So, hab jetzt den kompletten Schlüssel inkl. allen Unterschlüsseln rausgelöscht, und nochmal das Selbe wie oben schon gemacht. Jetzt steht das Selbe drin wie letztes mal, nur dass direkt unter .SCP kein Wert mehr gesetzt ist. Blöderweiße öffnet sich jetzt beim Doppelklick auf eine solche .SCP Datei der ganz normale "Öffnen mit" Dialog von Windows :cry:


----------



## thE_29 (29. Nov 2006)

Hö?!

Also wie gesagt, bei mir klappt das unter Win2k und WinXP!

Probier mal ne andere Endung...


----------



## The_S (29. Nov 2006)

k, werds heute Abend ausprobieren


----------



## The_S (29. Nov 2006)

Okay, mit ner anderen Endung gehts. Ich frag mich nur warum. Hast du ne Erklärung dafür? 

Kann man noch irgendwie einstellen, dass die Endung auch mitübergeben werden kann? Weil mein prog kann mit mehreren Dateitypen umgehen und so müsste ich erst die Datei analysieren um welchen Typ es sich handeld.

Danke!

[edit] Und wie muss ich vorgehen, wenn die Dateiendung bereits einem anderen Programm zugewiesen ist? Z. B. mp3 oder jpg ... ?


----------



## thE_29 (30. Nov 2006)

Wie, welche Endung soll mitübergeben werden?!

Naja, du müsstest nur den Reg Schlüssel löschen...

Man kann irgendwie via regedit /e was rauskriegen, ob man was löschen kann, weiß ich nicht...

Sonst müsstest du zu einer registry API greifen! (Obwohl die java.dll das genauso kann, nur sun hat das so hingebaut, das man es net nutzen kann!!)


----------



## The_S (30. Nov 2006)

thE_29 hat gesagt.:
			
		

> Wie, welche Endung soll mitübergeben werden?!



Wenn ich auf ne Datei klicke, die über die Registry mit meinem Programm verknüpft ist, dann bekomm ich nur den Pfad inkl. Datei aber ohne Dateiendung an mein Programm übergeben (warum auch immer). Klar könnt ich ein File erstellen, in dem ich einfach mal alle möglichen Dateiendungen die von meinem Programm unterstützt werden dranhängen und dann über die exists() Methode überprüfen ob diese Datei gemeint ist, aber das ist ja fehleranfällig. Deswegen wäre es super, wenn ich auch irgendwie einstellen könnte, dass auch die Dateiendung mitübergeben wird.



			
				thE_29 hat gesagt.:
			
		

> Naja, du müsstest nur den Reg Schlüssel löschen...



Sicher? Weil manuelles löschen meines .SCP - Schlüssel hats ja nicht wirklich gebracht ...



			
				thE_29 hat gesagt.:
			
		

> Man kann irgendwie via regedit /e was rauskriegen, ob man was löschen kann, weiß ich nicht...



Mal schauen ob ich was im Internet finde 



			
				thE_29 hat gesagt.:
			
		

> Sonst müsstest du zu einer registry API greifen!



Kann ich mich auch mal informieren  . Kannste mir ne gute empfehlen?



			
				thE_29 hat gesagt.:
			
		

> (Obwohl die java.dll das genauso kann, nur sun hat das so hingebaut, das man es net nutzen kann!!)



Das is ma wieder logik ... :roll:


----------



## thE_29 (30. Nov 2006)

Also ich kriege es mit Endung...

Habe mir ein Programm geschrieben mit Endung xyz und ich lasse args[0] in nem OptionPane anzeigen und da steht dann C:\bla.xyz

Warum das bei deinem SCP nicht geklappt hat, kann ich von hier net sagen...

Ich habe eine API wo eine dll dabei ist, die sich JRegistryKey.dll nennt!
Such mal im google danach..


----------



## The_S (30. Nov 2006)

Ist ja alles sehr merkwürdig ... ich glaub is besser wenn ich mir mal die API anschaue  . Aber nochmal Danke!


----------



## thE_29 (30. Nov 2006)

Hier, die Java.dll registry Befehle 

_Java_java_util_prefs_WindowsPreferences_WindowsRegCloseKey@12
_Java_java_util_prefs_WindowsPreferences_WindowsRegCreateKeyEx@16
_Java_java_util_prefs_WindowsPreferences_WindowsRegDeleteKey@16
_Java_java_util_prefs_WindowsPreferences_WindowsRegDeleteValue@16
_Java_java_util_prefs_WindowsPreferences_WindowsRegEnumKeyEx@20
_Java_java_util_prefs_WindowsPreferences_WindowsRegEnumValue@20
_Java_java_util_prefs_WindowsPreferences_WindowsRegFlushKey@12
_Java_java_util_prefs_WindowsPreferences_WindowsRegOpenKey@20
_Java_java_util_prefs_WindowsPreferences_WindowsRegQueryInfoKey@12
_Java_java_util_prefs_WindowsPreferences_WindowsRegQueryValueEx@16
_Java_java_util_prefs_WindowsPreferences_WindowsRegSetValueEx@20


Ach, wie fein wenn man die nutzen könnte!
Ich geh mal schaun, ob das irgendwie geht...


----------



## thE_29 (30. Nov 2006)

So, ich baue gerade eine registry API auf Basis der java.dll!

Öffnen und schließen geht schonmal


----------



## The_S (30. Nov 2006)

WOW! Echt Klasse


----------



## thE_29 (30. Nov 2006)

So, ist eigentlich schon fertig, nur geht von Java aus nur die Schlüsselwerte lesen...

Naja, man kann net alles haben..

Bin aber gerade dabei, das ganze in Sourceforge reinzuhauen, finde aber keine passende Lizenz, die zwar meinen Source zu Verfügung stellt, aber man den Source nicht manipulieren/ändern oder in einem Produkt verwenden darf!

Stelle das ganze ja als jar (sprich Library) zur Verfügung!


----------



## The_S (30. Nov 2006)

thE_29 hat gesagt.:
			
		

> So, ist eigentlich schon fertig, nur geht von Java aus nur die Schlüsselwerte lesen...



Heißt jetzt für mein Prob ( :arrow: *n00b am steur*  )?


----------



## thE_29 (30. Nov 2006)

Also, das was du brauchst, etc geht mit dem dann!

Ich warte nur noch auf die Bestätigung von Sourceforge, dann kann ichs uppen!


----------



## The_S (30. Nov 2006)

Ah, sehr schön  . Herzlichen dank :toll:


----------



## The_S (4. Dez 2006)

Braucht Sourceforge so lang, oder haste mich vergessen  ?


----------



## thE_29 (4. Dez 2006)

Tjo, da is noch immer nix zurückgekommen.... :/

Hoffe das heute was kommt.


----------



## thE_29 (4. Dez 2006)

So, ich bekam einfach keine mail..

https://sourceforge.net/projects/java-registry/


----------



## The_S (4. Dez 2006)

Ausgezeichnet  . Gibts dazu auch ne Doku? Ansonsten wühl ich mich einfach ma schnell daheim durch den Source-Code


----------



## thE_29 (4. Dez 2006)

Im Source gibts die Doku 

Also ich habs net extrahieren lassen! War zufaul und habe zZ Streß bei anderen Sachen!

Will die Doku ja auch auf Englisch bringen!


----------



## The_S (4. Dez 2006)

OK, danke. Ich schaus mir dann frühestens heute Abend mal an. Sollten dazu noch Fragen bestehen meld ich mich einfach  .


----------



## thE_29 (4. Dez 2006)

Hier ein bisi anfangs Code wie es geht 

http://www.java-forum.org/de/viewtopic.php?p=242833#242833


----------

