java client aus c-programm starten

Chefaid

Grünschnabel
Hallo zusammen,

Habe auf der Suche nach einer Lösung einiges gefunden, allerdings nichts, was meinem Problem als Lösung entspricht.
Meine Frage ist:

Wie kann ich eine schon kompilierte Java-Applikation von einem C programm starten welches auch noch Parameter benötigt?

Auf der Suche nach geeigneten Möglichkeiten bin ich auf die Funktion createProcess gestossen:

http://msdn.microsoft.com/en-us/library/ms682512(VS.85).aspx

Leider verstehe ich das Beispiel nicht ganz, denn wenn ich es Aufrufe sollen die Parameter im Anschluss noch einmal eingegeben werden - Die Parameter bzw. der Programmaufruf kann dem unteren Beispiel entnommen werden.

Die andere Möglichkeit war der Aufruf über system()
z.B.
Code:
int main()
{

char Text[]="java meinpackage.BPELClient";
char Text2[]="inputparameter 1 und 2";
     strcat(Text, Text2);
     printf("%s\n", Text);

     system("D:\\apps\\java\\BPEL_Client\\classpath.bat");
     system("D:\\apps\\java\\BPEL_Client\\" + Text");

      system("PAUSE");	
      return 0;
}

Der erste Aufruf für die Batch-Datei soll die Classpath-Variable setzen der zweite soll dann mein Programm + Parameter aufrufen .. Das will/soll wohl anders funktionieren?

Der Code-Teil soll auch veranschaulichen, welche Parameter ich für "createProcess" benötige.

ich hoffe das war soweit verständlich?
Vielen Dank schonmal

Schönen Gruß
Chefaid
 
Hi.

Zuerst einmal ist dein Code fehlerhaft. Du kannst an den String Text nichts mehr anhängen, denn du kannst dort max. 27 Zeichen speichern weil du das Array mit einem Stringliteral von 27 Zeichen initialisiert hast.
C:
char Text[100] = "java meinpackage.BPELClient";

Dann möchtest du wohl eigentlich mehrere Befehle der Shell hintereinander aufrufen und auch noch die gesetzen Variablen übernehmen:
C:
system("call pfad/classpath.bat & java package.class");
Aber warum schreibst du dir dafür nicht einfach eine Batch-Datei?

Gruß
 
Danke für die Antwort deepthroat!
Der Aufruf erfolgt aus einem MessageProcess einer Anwendung (PLM-System). Ich möchte dem Java-Programm ein Attribut(Parameter) übergeben.

Ja es stimmt, ich möchte diese Aufrufe hintereinander in der Shell ausführen.
Dein Beispiel funktioniert - nur: Wie hänge ich jetzt noch meine Parameter hinten an?
Denn das Java-Programm muss mit Parametern gestartet werden. So z.b.

Code:
java meinpackage.BPELCLient http://destroffm01:8080/active-bpel/services/TestLoginService namespace operation s Attribut-String-Zeichenfolge
Url, namespace, operation und s sind const.
nur Attribut-String-Zeichenfolge sind variabel.

Eine Batch-Datei ist dafür denke ich nicht geeignet?
 
Dein Beispiel funktioniert - nur: Wie hänge ich jetzt noch meine Parameter hinten an?
Das kannst du schon mit strcat oder mit sprintf machen - du mußt halt nur sicherstellen dass auch genug Speicher für den String reserviert ist, sonst überschreibst du irgendwas anderes im Speicher. (In C++ dann std::string verwenden.)
Eine Batch-Datei ist dafür denke ich nicht geeignet?
Also den Commando Prozessor mußt du so oder so aufrufen, da du ohnehin schon eine Batchdatei verwendest. Da kannst du doch auch einfach eine Batch Datei schreiben der du nur die String-Attribute als Parameter übergibst. Da läßt sich dann auch schnell mal etwas anpassen ohne Neukompilation.

Gruß
 
Mhm, wie soll das gehen mit der Batchdatei?

Für den Aufruf:
Code:
system("call pfad/Batchdatei.bat

In der Batchdatei:
Code:
set JAVA_HOME=..
set PATH=...
set CLASSPATH=...

java meinpackage.BPELClient url namespace operation s "Attribut-String-Variable"

?
 
Naja, im Grunde mußt du genau die gleichen Befehle aufrufen wie bei system() auch:
Code:
@echo off

CALL D:\apps\java\BPEL_Client\classpath.bat

SET attribute=%*

java meinpackage.BPELClient url namespace operation s "%attribute%"
Die Datei kannst du dann mit Parametern aufrufen:
C:
const char* batch = "c:\\path\\mybatch.cmd";
const char* attribs = ...;
char cmd[200];

sprintf(cmd, "%s %s", batch, attribs);

system(cmd);
Je nach dem welchen Wert die String-Attribute haben, mußt du natürlich aufpassen das keine Spezialzeichen drin sind. Da wäre es dann günstiger auf die CreateProcess Funktion zu schwenken - damit hast du dann noch mehr Kontrolle.

Gruß

PS: Beachte, das der Befehl bei system() synchron ausgeführt wird. D.h. es wird auf die Beendigung des Java-Programms gewartet.
 
Zuletzt bearbeitet:
So, danke erstmal.. Also der Aufruf funktioniert .. nur werden die Parameter nicht übergeben
Werden nämlich keine Übergeben, zeigt das Programm, welche Parameter übergeben werden sollen. Wenn ich also in der Shell:

Code:
java meinpackage.BPELClient http://destroffm01:8080/active-bpel/services/LoginService "" echo attribut1 attribut2
eingebe funktioniert es...
in der batch.cmd sieht es ja folgendermaßen aus.
Code:
java meinpackage.BPELClient http://destroffm01:8080/active-bpel/services/LoginService "" echo "%attribute%"

wenn ich in der batch.cmd nur
Code:
java meinpackage.BPELClient
erziehlt das das gleiche Ergebnis?!
 
Funktioniert es denn wenn du die Batch Datei per Hand aufrufst?

Ansonsten änder mal das @echo off zu @echo on und rufe dann die Batch datei nochmal mit Parametern auf. Wie lautet dann die Ausgabe?

Gruß
 
Es funktioniert mit manuellem Aufruf und den "richtigen" Parametern also: (also in shell batch.cmd aufrufen)

Code:
java meinpackage.BPELClient http://destroffm01:8080/active-bpel/services/LoginService "" echo s infodba s infodba
So sollte es sein:
Code:
D:\apps\Java\BPEL_Client>Batch.cmd

D:\apps\Java\BPEL_Client>CALL D:\apps\java\BPEL_Client\classpath.bat

D:\apps\Java\BPEL_Client>set JAVA_HOME=D:\apps\java\jdk1.5.0_16

D:\apps\Java\BPEL_Client>set PATH=D:\apps\java\jdk1.5.0_16\bin

D:\apps\Java\BPEL_Client>set CLASSPATH=D:\apps\java\BPEL_Client\bin;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib
/commons-discovery-0.2.jar;lib/commons-logging-1.0.4.jar;lib/jaxrpc.jar;lib/log4j-1.2.8.jar;lib/mail.jar;lib/saaj.jar;li
b/wsdl4j-1.5.1.jar;lib/jaxen-1.1-beta-8-no-dom.jar;lib/xerxcesImpl.jar;lib/xml-apis.jar;

D:\apps\Java\BPEL_Client>SET attribute=

D:\apps\Java\BPEL_Client>java meinpackage.BPELClient http://destroffm01:8080/active-bpel/services/LoginService "" echo s
 infodba s infodba

wsEndpoint  : http://destroffm01:8080/active-bpel/services/LoginService
wsNamespace :
wsMethod    : echo
type, value : s, infodba
type, value : s, infodba
Return      : class java.lang.String
              Login successfulinfodbainfodba

wobei "s infodba s infodba" die parameter sind

der c-code ist:
Code:
const char* batch = "D:\\apps\\java\\BPEL_Client\\Batch.cmd";
const char* attribs = "s infodba s infodba";
char cmd[200];
 
sprintf(cmd, "%s %s", batch, attribs);
 
system(cmd);

Die Shell liefert folgendes Ergebnis, wenn ich mein c-programm aufrufe
Code:
D:\DEVC\Dev-Cpp\Workspace\SystemCall2>SystemCall2.exe

D:\DEVC\Dev-Cpp\Workspace\SystemCall2>CALL D:\apps\java\BPEL_Client\classpath.bat

D:\DEVC\Dev-Cpp\Workspace\SystemCall2>set JAVA_HOME=D:\apps\java\jdk1.5.0_16

D:\DEVC\Dev-Cpp\Workspace\SystemCall2>set PATH=D:\apps\java\jdk1.5.0_16\bin

D:\DEVC\Dev-Cpp\Workspace\SystemCall2>set CLASSPATH=D:\apps\java\BPEL_Client\bin;lib/activation.jar;lib/axis.jar;lib/axi
s-ant.jar;lib/commons-discovery-0.2.jar;lib/commons-logging-1.0.4.jar;lib/jaxrpc.jar;lib/log4j-1.2.8.jar;lib/mail.jar;li
b/saaj.jar;lib/wsdl4j-1.5.1.jar;lib/jaxen-1.1-beta-8-no-dom.jar;lib/xerxcesImpl.jar;lib/xml-apis.jar;

D:\DEVC\Dev-Cpp\Workspace\SystemCall2>SET attribute=s infodba s infodba

D:\DEVC\Dev-Cpp\Workspace\SystemCall2>java meinpackage.BPELClient http://destroffm01:8080/active-bpel/services/LoginServ
ice "" echo "s infodba s infodba"

Eingabe 3er Parameter:
  1.: wsEndpoint - Endpunkt
  2.: wsNamespace - Namensraum
  3.: wsMethod - Methode des WS
Weitere Parameter f?r die ?bergabe:
  4.: i | d | s (type: 'int', 'double', or 'String')
  5.: value
  6./7. ...: weitere Typen/Werte
E.g.:
java mpackage.BPELCLient http://destroffm01:8080/active-bpel/services/TestLoginService namespace operation s pw s  usern
ame s"Teilenummer"
Press any key to continue . . .


Ich peils grad nicht...
Also wenn ich Batch.cmd mit den richtigen Parametern manuell aufrufe, geht es....
 
Zuletzt bearbeitet:
Es funktioniert mit manuellem Aufruf und den "richtigen" Parametern also: (also in shell batch.cmd aufrufen)

So sollte es sein:
Code:
D:\apps\Java\BPEL_Client>Batch.cmd
Hier hast du doch aber gar keine Parameter übergeben? Die hast du wohl fest in die Datei geschrieben...? :suspekt:

Nimm mal die Anführungszeichen um %attribute% weg und schau ob es dann geht.

Gruß
 
Zurück