Зачем вам разыгрывать?
Если obj поддерживает интерфейс, и все, что вам нужно сделать, это проверить, что перед передачей его в процедуру вы можете просто передать сам объект. Компилятор позаботится обо всем остальном. Третий параметр в вызове Supports нужен только для доступа к методам интерфейса.
Скомпилируйте и запустите код ниже. Он должен скомпилироваться без ошибок и предоставить вам окно консоли и диалоговое сообщение.
program Project1;
{$APPTYPE CONSOLE}
uses
Classes
, Dialogs
, SysUtils
;
type
iMyUnknown = interface(IInterface)
['{DA867EBA-8213-4A91-8E03-1AACA150CE77}']
procedure DoSomething;
end;
TMuster = class(TInterfacedObject, iMyUnknown)
procedure DoSomething;
end;
procedure WorkObject(iObj: iMyUnknown);
begin
if Assigned(iObj) then ShowMessage('Got something');
end;
{ TMuster }
procedure TMuster.DoSomething;
begin
beep;
end;
var
obj: TMuster;
begin
try
obj := TMuster.Create;
if Supports(obj, iMyUnknown) then
WorkObject(obj);
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.