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

interface und variable des implementierenden objekts

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

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

AW: interface und variable des implementierenden objekts

  Alt 20. Dez 2011, 14:02
OUT-Parameter sind Ausgabeparameter und da werden Eingangswerte nicht beachtet.
Dieses Problem sollte also immernoch bestehen.

Wenn nicht und Emba hat dieses Verhalten geändert, dann ist das ein Bug und Emba hat das gefälligst wieder auszubauen.
"Böse" ist eigentlich, daß der Eingangswert des Ausgangsparameters beachtet wird, was eigentlich nicht gemacht werden dürfte.

const/in = in ... ingibt es in Delphi nicht, aber es entspricht quasi dem Parameter ohne eine Angabe von var/out/const
var = in&out
out = out

Gut, Delphi scheint das Interface die Variable, vor Übergabe an den OUT-Parameter, freizugeben.
Letzteres SetOutI müßte in etwa das tun, was diese WMI-Schnittstelle macht ... also den Eingangsparameter zu ignorieren.
Was sagt denn ein älteres Delphi zu dem Code?
Delphi-Quellcode:
type
  TTestIntf = class(TInterfacedObject, IInterface)
    FStrings: TStrings;
    constructor Create(SL: TStrings);
    destructor Destroy; override;
  end;

constructor TTestIntf.Create(SL: TStrings);
begin
  inherited Create;
  FStrings := SL;
  FStrings.Add('TTestIntf.Create ' + IntToHex(Integer(Self), 8));
end;

destructor TTestIntf.Destroy;
begin
  FStrings.Add('TTestIntf.Destroy ' + IntToHex(Integer(Self), 8));
  inherited;
end;

procedure TForm6.SetVar(var Intf: IInterface);
begin
  Memo1.Lines.Add('SetVar begin');
  Intf := TTestIntf.Create(Memo1.Lines);
  Memo1.Lines.Add('SetVar end');
end;

procedure TForm6.SetOut(out Intf: IInterface);
begin
  Memo1.Lines.Add('SetOut begin');
  IInterface(Intf) := TTestIntf.Create(Memo1.Lines);
  Memo1.Lines.Add('SetOut end');
end;

procedure TForm6.SetVarD(var Intf);
begin
  Memo1.Lines.Add('SetVarD begin');
  IInterface(Intf) := TTestIntf.Create(Memo1.Lines);
  Memo1.Lines.Add('SetVarD end');
end;

procedure TForm6.SetOutD(out Intf);
begin
  Memo1.Lines.Add('SetOutD begin');
  IInterface(Intf) := TTestIntf.Create(Memo1.Lines);
  Memo1.Lines.Add('SetOutD end');
end;

procedure TForm6.SetOutI(out Intf);
var
  I: IInterface;
begin
  Memo1.Lines.Add('SetOutI begin');
  I := TTestIntf.Create(Memo1.Lines);
  I._AddRef;
  Pointer(Intf) := Pointer(I);
  Memo1.Lines.Add('SetOutI end');
end;

var Intf: IInterface;

Memo1.Lines.Add('');
Memo1.Lines.Add('create test-interface');
Intf := TTestIntf.Create(Memo1.Lines);
Memo1.Lines.Add('call SetVar');
SetVar(Intf);
Memo1.Lines.Add('set nil');
Intf := nil;

Memo1.Lines.Add('');
Memo1.Lines.Add('create test-interface');
Intf := TTestIntf.Create(Memo1.Lines);
Memo1.Lines.Add('call SetOut');
SetOut(Intf);
Memo1.Lines.Add('set nil');
Intf := nil;

Memo1.Lines.Add('');
Memo1.Lines.Add('create test-interface');
Intf := TTestIntf.Create(Memo1.Lines);
Memo1.Lines.Add('call SetVarD');
SetVarD(Intf);
Memo1.Lines.Add('set nil');
Intf := nil;

Memo1.Lines.Add('');
Memo1.Lines.Add('create test-interface');
Intf := TTestIntf.Create(Memo1.Lines);
Memo1.Lines.Add('call SetOutD');
SetOutD(Intf);
Memo1.Lines.Add('set nil');
Intf := nil;

Memo1.Lines.Add('');
Memo1.Lines.Add('create test-interface');
Intf := TTestIntf.Create(Memo1.Lines);
Memo1.Lines.Add('call SetOutI');
SetOutI(Intf);
Memo1.Lines.Add('set nil');
Intf := nil;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (20. Dez 2011 um 14:40 Uhr)
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:48 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