AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language interface und variable des implementierenden objekts
Thema durchsuchen
Ansicht
Themen-Optionen

interface und variable des implementierenden objekts

Ein Thema von snook · begonnen am 11. Dez 2011 · letzter Beitrag vom 22. Dez 2011
Antwort Antwort
snook

Registriert seit: 25. Jun 2010
94 Beiträge
 
Delphi 2005 Professional
 
#1

AW: interface und variable des implementierenden objekts

  Alt 17. Dez 2011, 02:22
Nee ich gebe die referenzen nur ordnungsgemäß via := nil frei, und das objekt dahinter wird gar nicht in einer referenz gespeichert. benutze tatsächlich blos die reinen interfaces. Was hat es mit IUnknown und COM denn auf sich? in der deklaration ist doch IUnknown = IInterface definiert (system.pas)

zu dem thema DLL's, ich hatte jetzt in den letzten tagen mal etwas zeit um das zu untersuchen, war aber leider nciht mehr hier im forum. habe den fehler etwas eindämmen können:

Delphi-Quellcode:
IEnumerator = interface(IINterface)
  procedure Reset; stdcall;
  procedure GetFirst(out obj); stdcall;
  function GetLast(out obj): integer; stdcall;
  function MoveNext: boolean; stdcall;
  function GetCurrent(out obj): integer; stdcall;
end;

IDataModule = interface(IEnumerator)
  ...
end;

IStreamModule = interface(IDataModule)
  procedure LoadFromStream(const AStream: IStream; Size: LongWord); stdcall;
  ...
end;

TResourceManager = class(TCustomPlugIn)
  procedure InitPlugIn(const PlugIn: IPlugIn);
end;

TSomePlugIn = class(TCustomPlugIn)
  FData: IDataModule;
  procedure ReadProperties(const Data: IDataModule);
end;

TResourceManager.InitPlugIn(const PlugIn: IPlugIn);
var temp : IStreamModule;
    tempData: IDataModule;
    Stream : IStream;
    StatStg : TStatStg;
    sSize : integer;
    chSize : Int64;
begin
  temp := TStreamDataModule.Create;
  Stream = TStreamAdapter.Create(TFileStream.Create(PlugIn.ResourceFile, fmReadOnly), soOwned);
  try
    ...
    Stream.Seek(0, soFromBeginning, ChSize);
    Stream.Stat(stStat, sSize);
    temp.LoadFromStream(Stream, stStat.cbSize);
    PlugIn.ReadProperties(temp); // --> hier ignoriert er teilweise änderungen
    if temp.QueryInterface(IDataModule, tempData) = S_Ok then
      PlugIn.ReadProperties(tempData); // --> damit klappt es besser, gelegentlich aber auch nicht
  finally
    tempData := nil;
    Stream := nil;
    temp := nil;
  end;
end;
Das PlugIn kommt jetzt aus irgendeiner DLL, meldet sich beim Server an und der initialisiert dann das PlugIn über den ResourcenManager.

Damit das PlugIn seine Resourcen aus dem Datenmodul lesen kann, muss es durch die enthaltenen Daten durchmanövrieren, dazu hat das Datenmodul ein Enumerator-Interface. Im Reset wird dann ein Zähler des Datenmoduls auf -1 gesetzt und mit MoveNext erhöht. Nach dem Lesen der Daten aus dem Stream, hat der Zähler jedoch den Wert der Anzahl an Items im Module, also muss das PlugIn vor dem Lesebeginn diesen resetten, klar. Das klappt aber dann nicht mehr zuverlässig, kurioserweise hilft dann im extremfall, ein neustart

Geändert von snook (17. Dez 2011 um 02:46 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: interface und variable des implementierenden objekts

  Alt 17. Dez 2011, 08:15
Und Du bist Dir sicher, das das immer das gleiche Objekt ist?
Deklariere dir einfach mal eine Eigenschaft 'UniqueID' des exportierten Objektes, dem Du im Konstruktor eine eindeutige ID zuweist (GetTickCount). Dann prüf doch mal, ob die UniqueID immer die gleiche ist.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#3

AW: interface und variable des implementierenden objekts

  Alt 17. Dez 2011, 09:54
Ich hätte in diesem Fall auch lieber mal den Code von GetLink gesehen. Auch der Cast auf Interface bei dem out-Parameter sieht nicht ganz koscher aus.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
snook

Registriert seit: 25. Jun 2010
94 Beiträge
 
Delphi 2005 Professional
 
#4

AW: interface und variable des implementierenden objekts

  Alt 17. Dez 2011, 14:59
der code von Get/Set -Link:

Delphi-Quellcode:
procedure TCustomDataModule.SetLink(const ALink: IInterface);
begin
  if Assigned(ALink) then
  begin
    if not supports(ALink, IDataChangeLink) then
      raise Exception.Create('SetLink, Invalid Interface-Type');
    if Assigned(FLink) then
      RemoveLink;
    ALink.QueryInterface(IDataChangeLink, FLink);
    FLink.InstallLink(self);
  end;
end;

procedure TCustomDataModule.GetLink(out Link);
begin
  // IDataChangeLink(Link) := FLink;
  FLink.QueryInterface(IDataChangeLink, Link);
end;
Edit: FLink ist vom Type IDataChangeLink

Geändert von snook (17. Dez 2011 um 15:06 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#5

AW: interface und variable des implementierenden objekts

  Alt 20. Dez 2011, 08:40
Ein untypisierter Parameter für die Rückgabe eines Interface scheint mir sehr verdächtig.
Wird hier eventuell die Referenzzählung ausgetrickst?
Warum nicht so:
Delphi-Quellcode:
procedure TCustomDataModule.GetLink(out Link: IDataChangeLink);
begin
  Link := FLink;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#6

AW: interface und variable des implementierenden objekts

  Alt 20. Dez 2011, 09:24
Warum nicht so:
Delphi-Quellcode:
procedure TCustomDataModule.GetLink(out Link: IDataChangeLink);
begin
  Link := FLink;
end;
Untypisch nicht, nahezu alle WMI-Implementationen machen sowas, für die Rückgabe der Werte.

Und das Ergebnis des Ganzen?
Speicherlecks.

Denn ist vorher schon was in dem Link-Parameter drin, dann wird es ignoriert und nicht freigegeben.
Für eine automatische Referenzzählung ist das OUT hier also der nahezu sichere Tot.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#7

AW: interface und variable des implementierenden objekts

  Alt 20. Dez 2011, 12:17
Und das Ergebnis des Ganzen?
Speicherlecks.

Denn ist vorher schon was in dem Link-Parameter drin, dann wird es ignoriert und nicht freigegeben.
Für eine automatische Referenzzählung ist das OUT hier also der nahezu sichere Tot.
Bis zu welcher Delphiversion bestand denn dieser Fehler seinerzeit? (bei XE und XE2 jedenfalls nicht mehr)

// EDIT:
Nicht einmal bei Delphi 2007 passiert das bei mir.
// EDIT2:
Und auch bei Delphi 3 nicht.

Das heißt so allgemein lässt sich das auf jeden Fall nicht sagen. Ich bekomme das nicht hin, dass das Problem auftritt.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (20. Dez 2011 um 12:25 Uhr)
  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 12:19 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