Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi 2007/XE - OleVariant Memory Problem mit Schnittstelle (https://www.delphipraxis.net/177453-delphi-2007-xe-olevariant-memory-problem-mit-schnittstelle.html)

taveuni 7. Nov 2013 09:56

Delphi 2007/XE - OleVariant Memory Problem mit Schnittstelle
 
Hallo zusammen,
Ich habe auch mal wieder eine Frage. Vor einiger Zeit musste ich ein Projekt von D2007 auf XE hochziehen.
Darin wird ein ActiveX eines Fremdherstellers benutzt welcher einen Algorithmus zur Bildanalyse anbietet.
Nach dem portieren haben wir bemerkt dass das Memory kontinuierlich steigt. Nach Tagen wurde der Fehler eingekreist.

Das Leak tritt an einer Funktion auf welche laut Dokumentation so beschrieben ist:

Code:
[Visual Basic] Function LoadFromMem(ByVal buffer As Variant, ByVal pixelformat As enumFormat) As Long
[Delphi] function LoadFromMem(buffer: Variant; pixelformat : TOleEnum) : Integer;
[C++] long LoadFromMem(VARIANT buffer, enumFormat pixelformat);
Der Wrapper nach dem Import in Delphi macht folgendes draus:

Delphi-Quellcode:
function LoadFromMem(buffer: OleVariant; pixelformat: enumFormat): Integer; dispid 54;


Eine ganz vereinfachte Funktion in Testprogramm sieht nun so aus:

Delphi-Quellcode:
procedure TForm1.LoadStreamToGxImage(AStream: TMemoryStream);
var
  Buf: Array of Byte;
begin
  Try
    SetLength(Buf,AStream.Size);
    AStream.Read(Buf[0],AStream.Size);
    gxImage.LoadFromMem(Buf, GX_JPEG); // dies ist der Aufruf an die Schnittstelle
  Finally
    SetLength(Buf,0);
  End;
end;
Funktioniert alles ganz wunderbar mit Delphi 2007. Mit Delphi XE2 steigt das Memory im Verhältnis zur Streamsize.
Hat irgendein netter Mensch irgendeine Idee weshalb X2 den Speicher nicht freigibt - D2007 aber schon?
Oder muss ich da noch irgendwo eine Compilereinstellung beachten/setzen?

Vielen Dank für Eure Mühe

Werner

Edit:
Mittlerweile habe ich noch "kurz" die XE5 Trial heruntergeladen und installiert.
Es ist das identische Verhalten zu beobachten. Ich bin wirklich! sehr froh falls jemand eine Idee hat.

taveuni 8. Nov 2013 15:51

AW: Delphi 2007/XE - OleVariant Memory Problem mit Schnittstelle
 
Ächz! Delphi treibt mich mal noch zum Wahnsinn!:?
Falls mal jemand ein ähnliches Problem hat:

Nach tagelangem googlen bin ich auf einen Link von Beckhoff gestossen.
Darin wird ganz unten bei "Comment" auf eine falsche Deklaration des Delphi Wrapper Imports hingewiesen. Die mussten dann speziell für Delphi eine andere Methode einführen.

Ich habe nun die ursprüngliche Deklaration der automatisch erzeugten *tlb.pas von:

Delphi-Quellcode:
function LoadFromMem(buffer: OleVariant; pixelformat: enumFormat): Integer; dispid 54;


auf

Delphi-Quellcode:
function LoadFromMem(var buffer: OleVariant; pixelformat: enumFormat): Integer; dispid 54;


Schau an: Das Memory Leak ist weg.
Weshalb aber Delphi 2007 den Parameter als Referenz übergibt obwohl der Parameter nicht als Var deklariert ist -
und warum Delphi XE beim Import die Deklaration falsch macht weiss der Geier.

Natürlich ist das nicht die Endlösung. Denn bei einer neuen Version des ActiveX wird die Korrektur überschrieben.
Das ganze hat mich etwa eine Woche gekostet. Ich bin platt.

Das Dumme ist einfach dass einem bei Delphi niemand (mehr) helfen kann.
Das ActiveX sowie die darunterliegende native API wird weltweit stark genutzt.
Aber entweder die Wrapper Schicht mit .net oder java. Darunter mit C oder C++.
Einige Delphi Nutzer sind vorhanden aber alle <= D2007.


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