» »

[Delphi] Memory leak ob klicu WebService-a

[Delphi] Memory leak ob klicu WebService-a

zhigatsey ::

Živjo,

za iskanje poslovnih partnerjev sem uporabil ddv inetis spletno storitev. Ker delphijev WSDL importer ne prebavi dobro wsdl datoteke, sem importani unit ročno popravil. Ko po klicu web service-a zaprem aplikacijo, dobim poročilo o memory leakih (ReportMemoryLeaksOnShutdown := True). Uporabljam Delphi 2010. Spodaj je popravljeni importani unit in primer klica. Ali lahko kdo preveri ali tudi v novejših verzijah delphija javi memory Leake oz. ali je mogoče problem v moji kodi. Če preverim s FastMM4 ne javi nič memory leakov ob koncu izvajanja, torej samo z delphijevim "vgrajenim" memory leak detektorjem dobim leake.

An unexpected memory leak has occurred. The unexpected small block leaks are:
1 - 12 bytes: Unknown x 1
13 - 20 bytes: Unknown x 3
61 - 68 bytes: Unknown x 1

Wsdl importer popravljena koda:

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://ddv.inetis.com/Iskalnik.asmx?wsdl
//  >Import : http://ddv.inetis.com/Iskalnik.asmx?wsdl>0
//  >Import : http://ddv.inetis.com/Iskalnik.asmx?wsdl>1
// Encoding : utf-8
// Version  : 1.0
// (11.9.2009 8:45:59 - - $Rev: 16699 $)
// ************************************************************************ //

unit libDDVInetis;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

const
  IS_OPTN = $0001;
  IS_UNBD = $0002;
  IS_NLBL = $0004;
  IS_REF  = $0080;


type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"[Gbl]

  TxmlTransakcijskiRacun = class(TRemotable)
  private
    FxmlTRR: String;
    FxmlVrstaRacuna: string;
    FxmlZaprt: Boolean;
    FxmlDatumZaprtja: TXSDateTime;
    FxmlDatumZadnjeSpremembe: TXSDateTime;
    FxmlImeBanke: String;
    FxmlDatumOdprtja: TXSDateTime;
  public
    destructor Destroy; override;
  published
    property xmlTRR: String  read FxmlTRR write FxmlTRR;
    property xmlVrstaRacuna: string read FxmlVrstaRacuna write FxmlVrstaRacuna;
    property xmlImeBanke: String  read FxmlImeBanke write FxmlImeBanke;
    property xmlDatumOdprtja: TXSDateTime  read FxmlDatumOdprtja write FxmlDatumOdprtja;
    property xmlDatumZadnjeSpremembe: TXSDateTime  read FxmlDatumZadnjeSpremembe write FxmlDatumZadnjeSpremembe;
    property xmlZaprt: Boolean  read FxmlZaprt write FxmlZaprt;
    property xmlDatumZaprtja: TXSDateTime  read FxmlDatumZaprtja write FxmlDatumZaprtja;
  end;

  TArrayOfTxmlTransakcijskiRacun = array of TxmlTransakcijskiRacun;

  TXmlZavezanec = class(TRemotable)
  private
    FxmlDavcnaStevilka: String;
    FxmlMaticnaStevilka: String;
    FxmlNaslov: String;
    FxmlStatus: string;
    FxmlNaziv: String;
    FxmlZavezanecZaDDV: Boolean;
    FxmlPlacnikDDV: Boolean;
    FxmlDatumRegistracije: TXSDateTime;
    FxmlDejavnost: String;
    FxmlUrad: String;
    FTxmlTransakcijskiRacun: TArrayOfTxmlTransakcijskiRacun;
  public
    destructor Destroy; override;
  published
    property xmlDavcnaStevilka: String  read FxmlDavcnaStevilka write FxmlDavcnaStevilka;
    property xmlMaticnaStevilka: String read FxmlMaticnaStevilka write FxmlMaticnaStevilka;
    property xmlStatus: string read FxmlStatus write FxmlStatus;
    property xmlNaziv: String read FxmlNaziv write FxmlNaziv;
    property xmlNaslov: String read FxmlNaslov write FxmlNaslov;
    property xmlZavezanecZaDDV: Boolean read FxmlZavezanecZaDDV write FxmlZavezanecZaDDV;
    property xmlPlacnikDDV: Boolean read FxmlPlacnikDDV write FxmlPlacnikDDV;
    property xmlDatumRegistracije: TXSDateTime  read FxmlDatumRegistracije write FxmlDatumRegistracije;
    property xmlDejavnost: String read FxmlDejavnost write FxmlDejavnost;
    property xmlUrad: String read FxmlUrad write FxmlUrad;
    property xmlTransakcijskiRacuni: TArrayOfTxmlTransakcijskiRacun read FTxmlTransakcijskiRacun write FTxmlTransakcijskiRacun;
  end;

  TArrayOfTxmlZavezanec = array of TxmlZavezanec;

  // ************************************************************************ //
  // Namespace : http://ddv.inetis.com/
  // soapAction: http://ddv.inetis.com/Isci
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : IskalnikSoap
  // service   : Iskalnik
  // port      : IskalnikSoap
  // URL       : http://ddv.inetis.com/Iskalnik.asmx
  // ************************************************************************ //

  IskalnikSoap = interface(IInvokable)
  ['{F1C4A65E-6E4B-E029-0CE4-7BF71E71C4FF}']
    function  Isci(const iskalni_niz: string): TArrayOfTxmlZavezanec; stdcall;
  end;

function GetIskalnikSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IskalnikSoap;


implementation
  uses SysUtils;

// TXmlZavezanec
destructor TXmlZavezanec.Destroy;
var
  I: Integer;
begin
  FreeAndNil(FxmlDatumRegistracije);
  for I := 0 to System.Length(FTxmlTransakcijskiRacun)-1 do
    SysUtils.FreeAndNil(FTxmlTransakcijskiRacun[I]);
  System.SetLength(FTxmlTransakcijskiRacun, 0);
  inherited Destroy;
end;

// TXmlTransakcijskiRacun
destructor TXmlTransakcijskiRacun.Destroy;
begin
  FreeAndNil(FxmlDatumZaprtja);
  FreeAndNil(FxmlDatumZadnjeSpremembe);
  FreeAndNil(FxmlDatumOdprtja);
  inherited Destroy;
end;

function GetIskalnikSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IskalnikSoap;
const
  defWSDL = 'http://ddv.inetis.com/Iskalnik.asmx?wsdl';
  defURL  = 'http://ddv.inetis.com/Iskalnik.asmx';
  defSvc  = 'Iskalnik';
  defPrt  = 'IskalnikSoap';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as IskalnikSoap);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(IskalnikSoap), 'http://ddv.inetis.com/', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IskalnikSoap), 'http://ddv.inetis.com/Isci');
  InvRegistry.RegisterInvokeOptions(TypeInfo(IskalnikSoap), ioDocument);
  RemClassRegistry.RegisterXSInfo(TypeInfo(TXmlZavezanec), 'http://ddv.inetis.com/', 'xmlZavezanec');
  RemClassRegistry.RegisterXSInfo(TypeInfo(TXmlTransakcijskiRacun), 'http://ddv.inetis.com/', 'xmlTransakcijskiRacun');

end.


Primer klica:

procedure ClearZavezanci(Zavezanci: libDDVInetis.TArrayOfTxmlZavezanec);
var
  iZavezanec: Integer;
begin
  for iZavezanec := 0 to Length(Zavezanci) - 1 do
    TXMLZavezanec(Zavezanci[iZavezanec]).Free;
  SetLength(Zavezanci, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Zavezanci: libDDVInetis.TArrayOfTxmlZavezanec;
  Iskalnik: libDDVInetis.IskalnikSoap;
begin
  Iskalnik := libDDVInetis.GetIskalnikSoap;
  Zavezanci := Iskalnik.Isci('Mercator');
  ClearZavezanci(Zavezanci);
end;


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Davčne blagajne (strani: 1 2 3 424 25 26 27 )

Oddelek: Programiranje
1344332501 (72504) Macketina
»

Podatki o slovenskih podjetjih

Oddelek: Pomoč in nasveti
51301 (1148) PaX_MaN
»

Odprtje s.p.

Oddelek: Loža
448238 (6641) next3steps
»

Davčna in matična številka podjetja

Oddelek: Informacijska varnost
94168 (3837) Miha 333
»

[Java]kompailiranje iz cmd

Oddelek: Programiranje
91296 (1020) ragezor

Več podobnih tem