AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit aus Delphi-Programm gestarteter Java Anwendung
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit aus Delphi-Programm gestarteter Java Anwendung

Ein Thema von R2009 · begonnen am 3. Mai 2010 · letzter Beitrag vom 5. Mai 2010
Antwort Antwort
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

Problem mit aus Delphi-Programm gestarteter Java Anwendung

  Alt 3. Mai 2010, 12:28
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:
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;
Kann irgendjemand mal über diesen Codeschnipsel schauen ob dort etwas offentsichtlich faul ist.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 3. Mai 2010, 14:14
Felche Fehlernummer liefert CreateProcess/GetLastError?

Was passiert auf diesen PC wenn du die Java-Anwendung direkt startest ohne deine Anwendung?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#3

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 3. Mai 2010, 14:20
Zitat von R2009:
..ich bin schier am verzweifeln.
Ja, kann das nachvollziehen, hört sich ja alles trivial an, ist es aber nicht!


Lade Dir das Teil unter #5 runter, berücksichtigt alles was mir derzeit so untergekommen ist.

http://www.delphipraxis.net/internal...801&highlight=

Thread #5

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 3. Mai 2010, 14:53
Hi Bernhard,

Zitat:
Felche Fehlernummer liefert CreateProcess/GetLastError?

Was passiert auf diesen PC wenn du die Java-Anwendung direkt startest ohne deine Anwendung?
Das mit der Fehlernummer habe ich noch nicht ausprobiert.
Ohne meine Oberfläche läuft das Tool einwandfrei.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 3. Mai 2010, 15:10
Wie startest Du den dieses Komandozeilenprogramm. Ansonsten könntest Du dir auch mal jdGui anschauen
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 4. Mai 2010, 07:50
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#7

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 4. Mai 2010, 08:29
Wieso ruft dein Tool die java.exe nicht selber auf, sondern geht erst über die Batch-Datei?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 4. Mai 2010, 11:02
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:
  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
    ...
Dies ist mein Aufruf:
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:
The CreateProcess function creates a new process and its primary thread. The new process executes the specified executable file.

BOOL CreateProcess(

LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
Wenn jetzt noch jemand die Ursache (bzw die Umgebungsvariable) kennt die das verursacht wäre ich richtig glücklich.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#9

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 4. Mai 2010, 16:30
Zitat von R2009:
Wenn jetzt noch jemand die Ursache (bzw die Umgebungsvariable) kennt die das verursacht wäre ich richtig glücklich.
Also die Sourcen hast Du dir nicht angesehen, oder?

Da Guckst Du --> uPipedProcess.pas

ist alles drinn was Du brauchst.

lg. Asat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Problem mit aus Delphi-Programm gestarteter Java Anwendu

  Alt 5. Mai 2010, 06:07
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz