AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi 2007/XE - OleVariant Memory Problem mit Schnittstelle
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 2007/XE - OleVariant Memory Problem mit Schnittstelle

Ein Thema von taveuni · begonnen am 7. Nov 2013 · letzter Beitrag vom 8. Nov 2013
Antwort Antwort
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
534 Beiträge
 
Delphi 11 Alexandria
 
#1

Delphi 2007/XE - OleVariant Memory Problem mit Schnittstelle

  Alt 7. Nov 2013, 10:56
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:

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.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.

Geändert von taveuni ( 7. Nov 2013 um 15:23 Uhr) Grund: Ergänzungen angebracht
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Delphi 2007/XE - OleVariant Memory Problem mit Schnittstelle

  Alt 8. Nov 2013, 16:51
Ä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:

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

auf

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.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  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 07:59 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