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