![]() |
Problem mit aus Delphi-Programm gestarteter Java Anwendung
Hi DP'ler,
ich bin schier am verzweifeln. Wir (müssen) ein Java Kommandozeilentool verwenden um unsere Zählermodems zu konfigurieren. Da dieses Tool sehr rudimentär aufgebaut ist haben wir uns entschlossen, mit Delphi, eine Oberfläche drumrum zu bauen. Das Kommandozeilentool nimmt Verbindung über Modem, seriell und IP auf. Das Kommandozeilentool funktioniert immer. Alles funktioniert, ausser Modem, wenn ich mein Tool nutze und das Modem in einem nicht IBM PC steckt oder angeschlossen ist. Aufgerufen wird das Ganze über diese Funktion (hab ich mir hier irgendwo gezogen). Die Pipes werden genutzt um irgendwelche Informationen zu bekommen wenn der Java Prozess beendet ist. An den Java Quellcode komme ich nicht heran.
Delphi-Quellcode:
Kann irgendjemand mal über diesen Codeschnipsel schauen ob dort etwas offentsichtlich faul ist.
function GetConsoleOutput(const Command: String; var Output, Errors: TStringlist): Boolean;
var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; PipeOutputRead: THandle; PipeOutputWrite: THandle; PipeErrorsRead: THandle; PipeErrorsWrite: THandle; Succeed: Boolean; Buffer: array [0..255] of Char; NumberOfBytesRead: DWORD; Stream: TMemoryStream; begin //Initialisierung ProcessInfo FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); //Initialisierung SecurityAttr FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.bInheritHandle := true; SecurityAttr.lpSecurityDescriptor := nil; //Pipes erzeugen CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); //Initialisierung StartupInfo FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb:=SizeOf(StartupInfo); StartupInfo.hStdInput := 0; StartupInfo.hStdOutput := PipeOutputWrite; StartupInfo.hStdError := PipeErrorsWrite; StartupInfo.wShowWindow := sw_Hide; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; if CreateProcess(nil, PChar(command), nil, nil, true, CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin result:=true; //Write-Pipes schließen CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsWrite); //Ausgabe Read-Pipe auslesen Stream := TMemoryStream.Create; try while true do begin application.ProcessMessages; succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Output.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeOutputRead); //Fehler Read-Pipe auslesen Stream := TMemoryStream.Create; try while true do begin application.ProcessMessages; succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Errors.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeErrorsRead); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); end else begin result:=false; CloseHandle(PipeOutputRead); CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsRead); CloseHandle(PipeErrorsWrite); end; end; Grüsse Rainer |
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Felche Fehlernummer liefert CreateProcess/GetLastError?
Was passiert auf diesen PC wenn du die Java-Anwendung direkt startest ohne deine Anwendung? |
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Zitat:
Lade Dir das Teil unter #5 runter, berücksichtigt alles was mir derzeit so untergekommen ist. ![]() Thread #5 lg. Astat |
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Hi Bernhard,
Zitat:
Ohne meine Oberfläche läuft das Tool einwandfrei. Grüsse Rainer |
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Wie startest Du den dieses Komandozeilenprogramm. Ansonsten könntest Du dir auch mal jdGui anschauen ;)
|
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Hallo Bernhard,
du hattest nach der Fehlernummer gefragt: Einen Fehler gibt es nicht, die Shell wird aufgerufen, nur passiert nichts was das Modem betrifft. Offentsichtlich scheint es "nur" ein Problem mit der Art des Aufrufs des Java Tools zu geben. Nochmal zur Vorgehensweise (Reihenfolge der Aufrufe): 1.) Mein Tool ruft über cmd.exe eine Batchdatei auf. 2.) In der Batchdatei steht: @echo off java.exe -jar -Dlog4j.configuration=file:log4j.xml D:\source_elster\uploadtool\uploadtool.jar %* es müsste doch auch möglich sein java unter umgehung der cmd.exe direkt aufzurufen oder? Ich stell mir vor, dass ich dann ein Problem weniger habe? Grüsse Rainer |
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Wieso ruft dein Tool die java.exe nicht selber auf, sondern geht erst über die Batch-Datei?
|
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Hi himitsu,
Diese Batch Datei, mitsamt dem Java commandtool, wurde uns vom Hersteller so übergeben. Um kompatibel zu bleiben habe ich das halt so realisiert. An alle die mir geholfen haben: ich habe den Fehler gefunden, jedoch wäre es mir noch lieber wenn ich auch die Ursache kennen würde. Mir ist aufgefallen, dass es im createprocess einen parameter gibt, der den aktuellen Pfad enthält. In meinem Aufruf stand da nur nil drin. Ersetzt man den mit Pfeilen gekennzeichneten Parameter durch nil, funktioniert das ganze auf IBM Laptops auf HP Laptops nicht. Ich gehe davon aus, dass die cmd shell sich nach dem Aufruf in irgendeinen subshare befindet, aber nicht in meinem Programmverzeichnis.
Delphi-Quellcode:
Dies ist mein Aufruf:
if CreateProcess(nil, PChar(command), nil, nil, true,
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or REALTIME_PRIORITY_CLASS, nil, --->pchar(directory)<-----, StartupInfo, ProcessInfo) then begin ...
Delphi-Quellcode:
dstr:='/c uploadtool.bat -i '+par[2]+' -f '+par[1]+' -t '+par[3]+' -p '+edit1.text+' -d';
GetConsoleOutput('cmd '+dstr,actpath,c,d); Zitat:
Grüsse Rainer |
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Zitat:
Da Guckst Du --> uPipedProcess.pas ist alles drinn was Du brauchst. lg. Asat |
Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu
Hi Astat,
F e h l e r g e f u n d e n! Mir fehlt nur noch die Erklärung warum cmd bzw java (Rechnerabhängig) das Einstiegsverzeichnis ändert. Mit Verlaub gesagt waren mir deine Sourcen etwas zu aufwändig und komplex. Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz