(C) fork(), spawnlp(), Leerzeichen, und andere Probleme
*Markus
- sonstiges
Hallo,
vielleicht kann mir hier jemand helfen.
ich will folgendes erreichen:
Ein JAR-Archiv soll durch ein Exe-File ausgeführt werden. Ich dachte mir, dass ich ein kleines Programm schreibe, das mit das JAR-File einfach aufruft, etwa mit system("java -jar jarfile.jar");
Das würde ja auch funktionieren, nur dummerweise bleibt die Konsole im Hintergrund offen, was relativ lästig ist. Um ein "fork()" kommt man also nicht herum. Dummerweise wird das in Windows wieder anders gelöst, also versuchte ich mit spawn das Problem zu lösen. Bei spawn muss ich wiederum jeden Parameter extra übergeben, was ja im Prinzip nicht so das Problem wäre, aber dummerweise stimmt dann der Pfad zu dem JAR-File nicht mehr, weil das Programm dann glaubt, das JAR-File wäre dort zu finden, wo letztendlich java.exe gefunden wurde.
Ich dachte mir, dass ich als Parameter dann eben den kompletten Pfad angeben muss, aber dumemrweise verschluckt sich spawn beim ersten Leerzeichen. Der String wird in diesem Befehl beim ersten Leerzeichen Null-Terminiert!
Was soll ich noch tun? Ich will doch einfach nur ein File in einem eigenen Prozess starten, oder das ganze irgendwie so drehen, dass NUR das JAR-File gestartet wird. Offensichtlich ist das eine halbe Lebensaufgabe.
Java bricht so ab: Exception in thread "main" java.lang.NoClassDefFoundError: C:\Dokumente, denn nach "Dokumente" kommt ein Leerzeichen. dirbuffer beinhaltet aber den kompletten Pfad. Das Problem liegt also bei der spawn-Funktion.
Kann mir jemand bei diesem Problem helfen? Der Code sieht z.Z. so aus:
#include <stdio.h>
#include <process.h>
#include <dir.h>
#include <string.h>
int main(void) {
char dirbuffer[200];
char filename[] = "programm.jar";
int result;
/* dirbuffer beinhaltet den Pfad zu dieser ausführbaren Datei. */
/* Hängt man nicht den aktuellen Pfad vor programm.jar, glaubt dieses */
/* Programm, dass programm.jar nur irgend ein Parameter ist und */
/* will programm.jar dort ausführen, wo java.exe gefunden wird, wodurch */
/* programm.jar nicht gefunden wird!*/
if (dirbuffer, getcwd(dirbuffer,sizeof(dirbuffer)) == NULL) {
fprintf(stderr, "Fehler bei getcwd...\n");
exit(1);
}
strcat(dirbuffer, filename);
result = spawnlp(P_WAIT, "java.exe", "-jar", dirbuffer, NULL);
if (result == -1) {
perror("Error from spawn1");
exit(1);
}
return 0;
}
Markus
Hallo,
Ein JAR-Archiv soll durch ein Exe-File ausgeführt werden. Ich dachte mir, dass ich ein kleines Programm schreibe, das mit das JAR-File einfach aufruft, etwa mit system("java -jar jarfile.jar");
Das würde ja auch funktionieren, nur dummerweise bleibt die Konsole im Hintergrund offen, was relativ lästig ist. Um ein "fork()" kommt man also nicht herum.
Was soll ich noch tun?
Für dein Vorhaben gibt es eine Lösung von Sun: Die Invocation API.
Mehr dazu siehe: http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html
Gruß
Stareagle
Danke für den Tipp. Ich weiß aber nicht, was ich davon halten soll, denn in dem Code muss man ja bspw den Pfad zu Java wissen (options[0].optionString = "-Djava.class.path=/usr/lib/java";) , was in meinem Fall wiederum ein Problem ist, denn wo der Kunde Java installiert hat, ist unklar.
Die Lösung soll einfach deppensicher sein. Ein Übergabeparameter von außen oder dgl. kommt nicht in Frage.
Markus
Hallo Markus.
Vielleicht hilft dir ja z.B. JSmooth weiter. Das Programm erstellt aus JARs exe-Dateien.
Servus,
Flo
Hallo,
danke. Das ist genau, was ich gesucht habe. :)
Markus