Ich möchte kein konkretes Problem lösen. Ich möchte nur verstehen warum folgender Code mit der Zeile
if castSuccessful then myIntf.doSomething();
eine
Zitat:
Im Projekt Project3.exe ist eine
Exception der Klasse $C0000005 mit der Meldung '
access violation at 0x00000001: read of address 0x00000001' aufgetreten.
wirft:
Delphi-Quellcode:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
IMyInterface =
interface
['
{88DDD9A5-F4BC-47B9-9240-31B1C986F230}']
procedure doSomething();
end;
TMyClass =
class(TInterfacedObject, IMyInterface)
public
constructor Create();
procedure doSomething();
end;
procedure justSupportsThings();
var
myObject: TObject;
myIntf: IMyInterface;
castSuccessful: Boolean;
begin
myObject := TMyClass.Create();
castSuccessful := Supports(myObject, IInterface, myIntf);
if castSuccessful
then myIntf.doSomething();
end;
constructor TMyClass.Create();
begin
_AddRef();
// Damit mich das Supports(..) nicht abräumt
end;
procedure TMyClass.doSomething;
begin
// nop
end;
begin
try
justSupportsThings();
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
readln;
end.
Mir ist klar, dass im Aurfuf
Supports(myObject, IInterface, myIntf);
die letzten beiden Parameter nicht wirklich zusammenpassen, denn
myIntf
ist vom Typ
IMyInterface = Interface(IInterface)
.
Bedeutet das etwa dass
Supports(..)
die Referenz nur soweit "befüllt" wie ich mit der
GUID angebe?
Ich habe mich mit den ganzen Dingen im Hintergrund (
VMT, all das) nie beschäftigt...