Przetwarzanie danych z aplikacji w Javie pod Delphi.

0

Witam serdecznie.
Mam klasy napisane w javie, ktore odwoluja sie do serwisu internetowego poprzez SOAP i uzyskuja pewne dane..
Mam rowniez aplikacje napisana w delphi, w ktorej te dane chcialbym dalej przetwarzac.
Czy istnieje jakies eleganckie rozwiazanie?
Dziekuje z gory za jakiekolwiek sugestie...

0

przecież Delphi normalnie obsługuje SOAP https://www.google.pl/search?q=delphi+soap

0

Niestyty nie mam dostepu do pliku definicji WSDL..
Ale tak jak napisalem posiadam JavaApi gdzie zaimplementowane sa klasy do obslugi serwisu i korzystania z danych.
Jakis pomysl?
Dzieki

1
Czarny Lew napisał(a):

Niestyty nie mam dostepu do pliku definicji WSDL..
Ale tak jak napisalem posiadam JavaApi gdzie zaimplementowane sa klasy do obslugi serwisu i korzystania z danych.
Jakis pomysl?

Przepisać ręcznie na delphi - powodzenia. Nie znam narzędzia/sposobu/czegokolwiek co by pozwalało pod delphi podpiąć jave. Możesz w javie napisać jakieś narzędzie, które odbierze dane z serwisu i przygotuje je dla delphi w jakiejś "zjadliwej" formie (xml, txt np.)

0

http://stackoverflow.com/questions/4424117/how-can-i-execute-javascript-in-my-delphi-program-without-twebbrowser

Z tym że napracujesz się z tym znacznie więcej niż podczas przepisania.
Bibliotek do obsługi SOAP jest multum, na WSDL świat się nie kończy.

0

Tak jak napisał poprzednik. Masz javę którą odpytuje jakieś API i dostaje wyniki.
Masz delphi które przetwarza wyniki.
Wiec twoj problem polega na tym jak przekazac wyniki z javy do delphi.
chyba ze chcesz miec tylko 'jeden program'. To trzeba przepisać w jedną lub drugą stronę kod.

Eksportuj w javie dane do pliku, a w delphi je odczytuj.

0

Wlasnie zabralem sie za Jave... sprobuje wywolanie z argumentem bez formy i zapisanie danych do pliku. Po stronie Delphi obserwowanie zmiany pliku i wtedy przetwarzanie danych.... mam nadzieje ze samo wywolanie javy nie bedzie zbyt dlugo trwalo

0

Czemu początkujące z dwóch wariantów jeden prosty drugi prawie niemożliwy do poprawnego zrealizowania zawsze wybierają ten drugi?
http://sourceforge.net/projects/indysoap/
Zainstaluj sobie i działaj.

0

Jeśli bawisz się z WS w delphi i tak jak ja korzystasz z Delphi7 to nie dziwię się dlaczego próbujesz wykorzystać klasy napisane w Javie :).

Delphi nie ze wszystkich sobie radzi, a już z pewnością nie wbudowana obsługa SOAP z Delphi7. Aby połączyć się np z kurierem FedEx musiałem się nieźle nakombinować.

Ale wracając do tematu. Ja również mam podobną aplikację, gdzie mam interfejs w Delphi, który pod spodem odpala klasy Javy. W moim przypadku to działa tylko dlatego, że klasa javy, którą wykorzystuję jest napisana w taki sposób, że można ją obsługiwać z konsoli zatem przyjmuje wartości jako parametry, a na końcu zwraca odpowiedni ciąg znaków.

Poniżej przykładowy kod:

procedure CaptureConsoleOutput(DosApp : string; var wynik : string);
const
  ReadBuffer = 1048576; // 1 MB Buffer
var
  Security : TSecurityAttributes;
  ReadPipe,WritePipe : THandle;
  start : TStartUpInfo;
  ProcessInfo : TProcessInformation;
  Buffer : Pansichar;
  TotalBytesRead,
  BytesRead : DWORD;
  Apprunning,n,
  BytesLeftThisMessage,
  TotalBytesAvail : integer;
begin
  with Security do
  begin
   nlength := SizeOf(TSecurityAttributes);
   binherithandle := true;
   lpsecuritydescriptor := nil;
  end;

  if CreatePipe (ReadPipe, WritePipe, @Security, 0) then
  begin
  // Redirect In- and Output through STARTUPINFO structure

    SetCurrentDir(ExtractFileDir( ParamStr(0)) ) ;

    Buffer := AllocMem(ReadBuffer + 1);
    FillChar(Start,Sizeof(Start),#0);   //!!wazne
    start.cb := SizeOf(start);
    start.hStdOutput := WritePipe;
    start.hStdInput := ReadPipe;
    start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
    start.wShowWindow := SW_HIDE;

    // Create a Console Child Process with redirected input and output
    //UniqueString(DosApp);
    if CreateProcess( nil ,
                  PChar(DosApp),
                  @Security,@Security,
                  true ,
                  CREATE_NO_WINDOW + NORMAL_PRIORITY_CLASS,
                  nil,
                  nil,
                  //pchar(ExtractFileDir(DosApp)),
                  start ,ProcessInfo) then
    begin
      n:=0;
      TotalBytesRead:=0;
      repeat
      // Increase counter to prevent an endless loop if the process is dead
        Inc(n,1);

        // wait for end of child process
        Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
        Application.ProcessMessages;
        // it is important to read from time to time the output information
        // so that the pipe is not blocked by an overflow. New information
        // can be written from the console app to the pipe only if there is
        // enough buffer space.

        if not PeekNamedPipe(ReadPipe ,@Buffer[TotalBytesRead],ReadBuffer ,@BytesRead,@TotalBytesAvail,@BytesLeftThisMessage) then
          break
        else if BytesRead > 0 then
          ReadFile(ReadPipe,Buffer[TotalBytesRead],BytesRead,BytesRead,nil);
        TotalBytesRead:=TotalBytesRead+BytesRead;
      until (Apprunning <> WAIT_TIMEOUT) or (n > 250);

//      Buffer[TotalBytesRead]:= #0;
//      OemToChar(Buffer,Buffer);
//      SetLength(res,TotalBytesRead);
//      OemToChar(Buffer,PChar(res));
      wynik := string(Buffer);
      if not ((Length(wynik) > 4) and (Length(wynik)<10)) then
        wynik := 'ERROR';
    end;
    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
var w : string ;
begin
  if OpenDialog1.Execute()then
    if OpenDialog1.FileName <> '' then
    begin
      Image321.Bitmap.LoadFromFile(OpenDialog1.FileName); 
      SetCurrentDir(ExtractFilePath(Application.ExeName));
      CaptureConsoleOutput('java -jar javaanpr.jar -recognize -i "' + OpenDialog1.FileName + '"' ,w);
      Label1.Caption := w;
    end;
end;

Jakość kodu nie jest porywająca gdyż to jest demo przygotowane na potrzeby prezentacji dla klienta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1