![]() |
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:
Der Wrapper nach dem Import in Delphi macht folgendes draus:
[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);
Delphi-Quellcode:
function LoadFromMem(buffer: OleVariant; pixelformat: enumFormat): Integer; dispid 54;
Eine ganz vereinfachte Funktion in Testprogramm sieht nun so aus:
Delphi-Quellcode:
Funktioniert alles ganz wunderbar mit Delphi 2007. Mit Delphi XE2 steigt das Memory im Verhältnis zur Streamsize.
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; 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. |
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 ![]() 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 20:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz