AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wrapper für SOAP Aufrufe gesucht

Ein Thema von Sherlock · begonnen am 27. Jan 2017 · letzter Beitrag vom 31. Jan 2017
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#1

Wrapper für SOAP Aufrufe gesucht

  Alt 27. Jan 2017, 13:47
Delphi-Version: 10 Berlin
Ich habe da ein kleines "Problem" Ich habe zur Kommunikation mit einem SOAP Server ca. 15 Methoden, die die eigentlichen SOAP-Calls die der Delphi-WSDL Assistent erzeugt aufruft. Da das multithreaded und auch plattformübergreifend gehen muss sehen diese Methoden weitgehend gleich aufgeblasen aus:

Delphi-Quellcode:
function TKommunikation.SendShutDown(aShutDownType: Integer): Boolean;
var
  ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas
begin
  Result := False;
{$IFDEF MSWINDOWS}
  CoInitialize(nil);
{$ENDIF MSWINDOWS}
  ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
  if fConnectionOK then
  begin
  // Individuelles von hier
    Result := ServerPort.Shutdown(aShutDownType) = 'Done';
  // bis hier
  end;
{$IFDEF MSWINDOWS}
  CoUninitialize;
{$ENDIF MSWINDOWS}
end;
Es ergeben sich bei den Methoden nur marginale Unterschiede im als Individuell markierten Bereich. Ich habe nach einer langen Woche nur noch Bretter vor dem Kopf und komme nicht darauf, wie ich das 15 fache
Delphi-Quellcode:
var
  ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas
begin
  Result := False;
{$IFDEF MSWINDOWS}
  CoInitialize(nil);
{$ENDIF MSWINDOWS}
  ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
nur noch einmal brauche. Ich hatte mich bis eben daran versucht den eigentlichen SOAP-Call als Parameter an eine einzelne Methode zu übergeben, die dann das ganze Brimborium drumherum klatscht. Aber das scheiterte an meinen Gehirnwindungen...bin ich auf dem Holzweg?
Delphi-Quellcode:
function TKommunikation.SOAPComWrapper(aFunc: TFunc<Integer, Boolean>): Boolean;
var
  ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas
begin
  Result := False;
{$IFDEF MSWINDOWS}
  CoInitialize(nil);
{$ENDIF MSWINDOWS}
  ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
  if fConnectionOK then
  begin
    Result := aFunc; // Das mag der Compiler nicht, es fehlen ja Parameter, aber die sollen
                      // ja mit übergeben werden dachte ich...
  end;
{$IFDEF MSWINDOWS}
  CoUninitialize;
{$ENDIF MSWINDOWS}
end;
Ist das ein falscher Ansatz? Geht es anders leichter oder besser?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wrapper für SOAP Aufrufe gesucht

  Alt 27. Jan 2017, 14:02
Wie wäre es mit einer Property vom Typ des Interfaces und Lazy Initialization?
Delphi-Quellcode:
type
  TKommunikation = class
  private
    FServerPort: DevicePortType;
    function GetServerPort: DevicePortType;
  public
    property ServerPort: DevicePortType read GetServerPort;
  end;

function TKommunikation.GetServerPort: DevicePortType;
begin
  if not Assigned(FServerPort) then
    begin
      {$IFDEF MSWINDOWS}
      CoInitialize(nil);
      {$ENDIF MSWINDOWS}
      FServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
    end;
  Result := FServerPort;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (27. Jan 2017 um 14:37 Uhr) Grund: Fehler (Zugriff auf die Property in ihrem eigenen Getter) korrigiert
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wrapper für SOAP Aufrufe gesucht

  Alt 27. Jan 2017, 14:06
Delphi-Quellcode:
function TKommunikation.SOAPComWrapper(aFunc: TFunc<Integer, Boolean>; intparam : integer; boolparam : boolean): Boolean;
var
  ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas
begin
  Result := False;
{$IFDEF MSWINDOWS}
  CoInitialize(nil);
{$ENDIF MSWINDOWS}
  ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
  if fConnectionOK then
  begin
    Result := aFunc(intparam, boolparam); // Das mag der Compiler nicht, es fehlen ja Parameter, aber die sollen
                      // ja mit übergeben werden dachte ich...
  end;
{$IFDEF MSWINDOWS}
  CoUninitialize;
{$ENDIF MSWINDOWS}
end;
Das wäre eine Möglichkeit
Fritz Westermann
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Wrapper für SOAP Aufrufe gesucht

  Alt 27. Jan 2017, 14:20
Die andere Möglichkeit :

Delphi-Quellcode:
 TSoapCall = reference to function (): boolean ;

function TMyClass.SOAPComWrapper(aFunc: TSoapCall): Boolean;
var
  ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas
begin
  Result := False;
{$IFDEF MSWINDOWS}
  CoInitialize(nil);
{$ENDIF MSWINDOWS}
  ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
  if fConnectionOK then
  begin
    Result := aFunc(); // Das mag der Compiler
                     
  end;
{$IFDEF MSWINDOWS}
  CoUninitialize;
{$ENDIF MSWINDOWS}
end;

// Aufrufen
if SOAPComWrapper(function() : boolean
   begin
    result := myCall(1, false); // Hie den gewünschten Aufruf
   end

  ) then;
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wrapper für SOAP Aufrufe gesucht

  Alt 27. Jan 2017, 14:25
Oha! Das werde ich ausprobieren! Aber erst geh ich ins Wochenende
Montag berichte ich dann. Danke für die Hinweise!

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Wrapper für SOAP Aufrufe gesucht

  Alt 30. Jan 2017, 07:48
Jaaa, das geht so nicht ganz. Weil, die gewrappte Methode ja eine Methode des ServerPort ist. Und ServerPort wird erst im Wrapper erzeugt.

Vermutlich lass ich den Code dann halt so aufgepustet...

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#7

AW: Wrapper für SOAP Aufrufe gesucht

  Alt 30. Jan 2017, 17:09
Hmm..

Oder mach es so:

Delphi-Quellcode:
type
  TSOAPFunc = function( ServerPort: DevicePortType):boolean;

function TKommunikation.SOAPComWrapper(aFunc: TSOAPFunc): Boolean;
var
  ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas
begin
  Result := False;
{$IFDEF MSWINDOWS}
  CoInitialize(nil);
{$ENDIF MSWINDOWS}
  ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
  if fConnectionOK then
  begin
    Result := aFunc(ServerPort); // mit übergeben wird der ServerPort
  end;
{$IFDEF MSWINDOWS}
  CoUninitialize;
{$ENDIF MSWINDOWS}
end;
mit deiner Funtion für z.B. Shutdown:

Delphi-Quellcode:
function ServerShutdown(aServerPort: DevicePortType):boolean;
begin
  Result := aServerPort.Shutdown(aShutDownType) = 'Done';
end;
AUfruf mit:

// Aufrufen
if SOAPComWrapper(ServerShutdown) then ...;
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Wrapper für SOAP Aufrufe gesucht

  Alt 31. Jan 2017, 12:09
Oder Du holst Dir über eine Class-Function ein Interface und setz CoInit und im Destructor der Interface-classe den CoUnInit.

Dann noch eine Procedure mit übergeben und schon hast Du alles was Du brauchst.

Delphi-Quellcode:
Procedure MyWebAufruf;
begin
  SOAP.Call( // SOAP gibt ein IInterface zurück
    Procedure
      begin
        // Whatever
      end);
end;
Mavarik
  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 15:24 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