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;