Bisher habe ich noch nicht sonderlich viel mit Interfaces gemacht, eigentlich fast nur abstrakte Klassen, wenn ich eine gleichwertige Funktionalität benötigt habe.
Ich habe eine Instanz einer Klasse, welche von einem Interface erbt. Diese wird irgendwann mal erstellt und irgendwann freigegeben. Nun habe ich folgendes Problem: Folgendes funktioniert nicht:
Code: Alles auswählen
const
STest = '{982DE917-23B3-4FEF-B427-54E82D7866D5}';
type
ITest = interface(IUnknown)
[STest]
procedure Test; stdcall;
end;
TTest = class(TInterfacedObject, ITest)
public
procedure Test; stdcall; virtual;
end;
...
procedure TTest.Test; stdcall;
begin
WriteLn('Test method called');
end;
var
C: TTest; // Class instance
I: ITest; // Interface instance. Diese wird irgendwann mal vom Nutzer angefordert.
begin
C := TTest.Create;
if C.GetInterface(STest, I) then begin
I.Test;
end
else WriteLn('Error');
ReadLn;
C.Free; // Hier krachts
ReadLn;
end.
Es kracht mit RunError 204, was laut https://www.freepascal.org/docs-html/user/userap4.html folgendes ist:
Wieso ist das so und was kann ich da machen?https://www.freepascal.org/docs-html/user/userap4.html hat geschrieben: 204 Invalid pointer operation
You will get this in several cases:
• if you call Dispose or Freemem with an invalid pointer
• ...