Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Zugriffsverletzung bei SOAP-Abfrage (https://www.delphipraxis.net/118782-zugriffsverletzung-bei-soap-abfrage.html)

Chaosworld 14. Aug 2008 19:00


Zugriffsverletzung bei SOAP-Abfrage
 
Ich muss Daten über ein SOAP-Portal übertragen. Bei einer einzigen Abfrage erhalte ich leider immer diese Fehlermeldung:
"Zugriffsverletzung bei Adresse 0040435C in Modul 'SDIAPP.exe'. Lesen von Adresse 0000BCED."

Weil ich keine Idee habe, wie ich mich dem Fehler nähern könnte, zuerst die verkürzte Unit die von SOAP-Importer erstellt wurde:

Delphi-Quellcode:
unit TestFacade1;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
....
  TestFacade = interface(IInvokable)
  ['{27C48D16-7064-823C-0EB4-AA7AD67AD11B}']
...
    function createRIS_QSFindings(const institut: Institut; const findings: AxdRIS_QSFindings): EntityKey; stdcall;
  end;
..
  Institut = class(TRemotable)
  private
    Fname_: WideString;
    Fnumber: WideString;
    Fpassword: WideString;
  published
    property name_:   WideString Index (IS_NLBL) read Fname_ write Fname_;
    property number:  WideString Index (IS_NLBL) read Fnumber write Fnumber;
    property password: WideString Index (IS_NLBL) read Fpassword write Fpassword;
  end;
...
  AxdRIS_QSFindings = array of finding2;

  finding2 = class(AxdEntity_Finding2)
  private
  published
  end;

  AxdEntity_Finding2 = class(TRemotable)
  private
    FbusRelFinding: Array_Of_AxdEntity_BusRelFinding;
    FRIS_AnalyticalDeficiencyNotCor2Spec: WideString;
    FRIS_CapacityDeficiencyNotCor2Spec: WideString;
...
  public
    destructor Destroy; override;
  published
    property busRelFinding:                       Array_Of_AxdEntity_BusRelFinding  Index (IS_UNBD or IS_NLBL) read FbusRelFinding write FbusRelFinding;
    property RIS_AnalyticalDeficiencyNotCor2Spec: WideString                        Index (IS_NLBL) read FRIS_AnalyticalDeficiencyNotCor2Spec write FRIS_AnalyticalDeficiencyNotCor2Spec;
    property RIS_CapacityDeficiencyNotCor2Spec:   WideString                        Index (IS_NLBL) read FRIS_CapacityDeficiencyNotCor2Spec write FRIS_CapacityDeficiencyNotCor2Spec;
    property RIS_ContaminationDeficiencyNotCor2Sp: WideString                        Index
....
  end;

  AxdEntity_BusRelFinding = class(TRemotable)
  private
    FAVA_SAPAccountNum: WideString;
    FbusRelAccount: WideString;
    FbusRelTypeId: WideString;
  published
    property AVA_SAPAccountNum: WideString Index (IS_NLBL) read FAVA_SAPAccountNum write FAVA_SAPAccountNum;
    property busRelAccount:    WideString Index (IS_NLBL) read FbusRelAccount write FbusRelAccount;
    property busRelTypeId:     WideString Index (IS_NLBL) read FbusRelTypeId write FbusRelTypeId;
  end;
und meine eine Test-Routine:

Delphi-Quellcode:
procedure TSDIAppForm.Button4Click(Sender: TObject);
var firma : Institut;
    Abfrage: TestFacade;
    Antwort: EntityKey;
    findings: finding2;
    Finding: AxdRIS_QSFindings;
    busRelFinding: AxdEntity_BusRelFinding;
    Array_busRelFinding: Array_Of_AxdEntity_BusRelFinding;
Begin
...
  firma:= TestFacade1.Institut.Create;
  firma.name_ :='test';
  firma.number:='123456789';
  firma.password:='test1234';




  findings:=TestFacade1.finding2.Create;
  finding:= AxdRIS_QSFindings.create(findings);


  Array_busRelFinding :=Array_Of_AxdEntity_BusRelFinding.Create(busRelFinding);

  busRelFinding.AVA_SAPAccountNum:='123456789';
  findings.busRelFinding:=Array_busRelFinding;

  findings.RIS_QSExtFindingFlag:='Yes';
  findings.RIS_QSFindingReportStatus:=Closed;
... (hier werden noch einige weitere Parameter gefülllt)
  Abfrage:= HTTPRIO as TestFacade;

  Antwort := TestFacade1.EntityKey.create;
  Antwort:=Abfrage.createRIS_QSFindings(firma,finding); **
genau an der ** Stelle kommt immer der Zugriffsfehler. Wenn ich jedoch die Zeite
Delphi-Quellcode:
  findings.busRelFinding:=Array_busRelFinding;
erhalten ich die Exception:
"java.rmi.ServerException accourred in server thread, nested exception is:
java.rmi.RemoteException: ; nested exception is:
java.land.NullPointerException."

Ich geher daher davon aus, dass die Abfrage korrekt rausgesendet wird, und bei der Antwort der Fehler auftritt. Nur weiter komme ich einfach nicht.

Und was dann noch mehr verwirrt, wenn ich busRelFinding komplett fülle, also:
Delphi-Quellcode:
  busRelFinding.AVA_SAPAccountNum:='123456789';
  busRelFinding.busRelAccount:='591892';
  busRelFinding.busRelTypeId:='Institut';
Erhalte ich von Delphi ein
"Invalid Address specified to RtlReAllocateHeap( 00150000, 0013F8BC ) Prozess SDIAPP.exe (8096)"
und Delphi springt ins CPU-Fenster.

Wäre echt super, wenn mir jemand zeigen könnte, wo ich meinen Gedankenfehler mache.
Danke schon mal für jede Antwort

Chaosworld

PS: Benutze Delphi 2007

Keldorn 14. Aug 2008 19:47

Re: Zugriffsverletzung bei SOAP-Abfrage
 
Hallo,

ich probiers mal:-):

Die dynamischen arrays brauchst Du nicht per create zu erzeugen. Du hast nirgends ein setlength stehen, das fehlt Dir. ganz normal mit setlength die arraygröße einstellen und dann mußt du jedes Element des array mit create erzeugen, bevor du es füllst. Du übergibst ein komplett leeres array = Nil und bekommst deshalb die Exception.

Delphi-Quellcode:
  setlength(Array_busRelFinding,1);
  Array_busRelFinding[0]:=AxdEntity_BusRelFinding.create;
  Array_busRelFinding[0].AVA_SAPAccountNum:='123456789';
  findings.busRelFinding:=Array_busRelFinding;
Zitat:

Abfrage:= HTTPRIO as TestFacade;
versteh ich nicht. in deinem Importcode fehlt auch eine Zeile, da muß im interface Teil als letztes eine solche function stehen:
Delphi-Quellcode:
function GetIXYZ(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ITestFacade;
und in deinem ButtonclickCode sollte dann als erstes stehen
Delphi-Quellcode:
Abfrage:=GetIxyz(false,'',Nil*);
* oder du hast selber einen Rio erstellt, wenn du z.B. die Request/Response mitschneiden willst, oder ihn zur Authentifizierung brauchst.

Zitat:

Antwort := TestFacade1.EntityKey.create;
brauchst du nicht.

Gruß Frank

Chaosworld 15. Aug 2008 10:30

Re: Zugriffsverletzung bei SOAP-Abfrage
 
@Keldorn danke für deine Antwort

setlength geht leider nicht, da dies in der SOAP-Routine wohl nicht so angelegt wurde. Aber der Fehler war am ende doch recht einfach,

ich musste vor:

Array_busRelFinding :=Array_Of_AxdEntity_BusRelFinding.Create(busRelFi nding);

noch das hier machen:

busRelFinding:=AxdEntity_BusRelFinding.Create;

Sonst war zwar Array_busRelFinding initiatlisiert, aber der enthielt dann einen Verweis auf den nicht existierenden busRelFinding.

Somit ist der Fehler dann behoben.


Chaosworld

Keldorn 17. Aug 2008 18:28

Re: Zugriffsverletzung bei SOAP-Abfrage
 
Zitat:

Zitat von Chaosworld
setlength geht leider nicht, da dies in der SOAP-Routine wohl nicht so angelegt wurde.

warum meinst du geht setlength nicht? Deine Delphi-Version kommt doch mit dyn. Arrays bei webservices klar.

Chaosworld 18. Aug 2008 09:41

Re: Zugriffsverletzung bei SOAP-Abfrage
 
Hallo,
keine Ahnung, ich hatte es probiert mit setlength und das Funktioniert leider nicht. Irgendwie scheint es bei diesem Webservice damit Probleme zu geben. Warum kann ich dir aber auch nicht sagen, hatte es dann mit Create probiert und da es damit gut funktionierte, bin ich der Sache dann nicht weiter nachgegangen.

Chaosworld


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 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