Einzelnen Beitrag anzeigen

pflaume

Registriert seit: 3. Nov 2007
3 Beiträge
 
#1

Supports ohne out Parameter

  Alt 10. Okt 2012, 10:28
Delphi-Version: 2009
Hallo,

Ich werde nicht so recht schlau aus dem was genau bei den folgenden Situationen passiert.
Es geht um diese Funktion aus der SysUtils.pas:

function Supports(const Instance: TObject; const IID: TGUID): Boolean; Wenn man das unten stehende Programm ausführt, verabschiedet es sich an markierter Stelle #1 mit einer
EInvalidPointer Exception (wahrscheinlich beim Freigeben der temporären Variable aus einer anderen
Supports() Überladung).

Delphi-Quellcode:
program Project38;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  IFirst = interface
    ['{BC927DB0-9B4D-49C4-8460-6714605F4F20}']
  end;

  ISecond = interface
    ['{F7DBA334-8216-4435-AD56-2E9465CE975B}']
  end;

  TFirstSecond = class(TInterfacedObject, IFirst, ISecond)
  end;

var
  a: TFirstSecond;
  f: IFirst;
  s: ISecond;

begin
  a := TFirstSecond.Create;

  if Supports(a, IFirst) then
    Writeln('a supports IFirst');

  if Supports(a, ISecond) then // #1
    Writeln('a supports ISecond');

  if Supports(a, IFirst, f) then
    Writeln('[out] a supports IFirst');

  if Supports(a, ISecond, s) then
    Writeln('[out] a supports ISecond');

  Readln;
end.
Ändert man das folgende Programm ab und ersetzt die Writeln Aufrufe durch ShowMessage,
verschwindet dieser Fehler.

Delphi-Quellcode:
program Project38;

{$APPTYPE CONSOLE}

uses
  Dialogs,
  SysUtils;

type
  IFirst = interface
    ['{BC927DB0-9B4D-49C4-8460-6714605F4F20}']
  end;

  ISecond = interface
    ['{F7DBA334-8216-4435-AD56-2E9465CE975B}']
  end;

  TFirstSecond = class(TInterfacedObject, IFirst, ISecond)
  end;

var
  a: TFirstSecond;
  f: IFirst;
  s: ISecond;

begin
  a := TFirstSecond.Create;

  if Supports(a, IFirst) then
    ShowMessage('a supports IFirst');

  if Supports(a, ISecond) then
    ShowMessage('a supports ISecond');

  if Supports(a, IFirst, f) then
    ShowMessage('[out] a supports IFirst');

  if Supports(a, ISecond, s) then
    ShowMessage('[out] a supports ISecond');

  Readln;
end.
Hinzu kommt das der erste Aufruf von Supports() ohne out Parameter, scheinbar
die Variable a verändert. Leider reicht mein Assemblerwissen nicht ganz aus
um alles nachzuvollziehen was in class function TObject.GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
geschiet.
Nach meinem Verständnis müssten alle vier Meldungen angezeigt werden, stattdessen wird nur die erste angezeigt.

Vielleicht kann jemand Licht ins Dunkel bringen
  Mit Zitat antworten Zitat