Как передать интерфейсный объект вызову функции Pascal Script?

Дельфийская часть:

У меня есть класс с событием, и из этого события мне нужно вызвать процедуру, передающую ей интерфейсный объект. Он отлично работает в Delphi, но у меня проблемы с его объявлением в Pascal Script.

На фоне -интерфейс IGPGraphicsявляется частью интерфейса Delphi GDI+ library. и без методов определяется так:

type
  IGdiplusBase = interface
  ['{24A5D3F5-4A9B-42A2-9F60-20825E2740F5}']
  IGPGraphics = interface(IGdiPlusBase)
  ['{57F85BA4-CB01-4466-8441-948D03588F54}']

Ниже приведен упрощенный псевдокод Delphi того, что мне нужно сделать в Pascal Script :

type
  TRenderEvent = procedure(Sender: TObject; const GPGraphics: IGPGraphics) of object;
  TRenderClass = class(TGraphicControl)
  private
    FOnRender: TRenderEvent;
  public
    property OnRender: TRenderEvent read FOnRender write FOnRender;
  end;

// when the TRenderClass object instance fires its OnRender event I want to call 
// the RenderObject procedure passing the IGPGraphics interfaced object to it; I
// hope I'm doing it right, I'm just a newbie to this stuff - but it works so far
// in Delphi (since I didn't get it to work in Pascal Script)

procedure TForm1.RenderClass1Render(Sender: TObject; const GPGraphics: IGPGraphics);
begin
  RenderObject(GPGraphics, 10, 10);
end;

// what I need in Pascal Script is between these two lines; just pass the interface
// object from the event fired by component to the procedure called from inside it

procedure RenderObject(const GPGraphics: IGPGraphics; X, Y);
begin
  // and here to work with the interfaced object somehow
end;

. Часть компиляции Pascal Script:

Моя цель - иметь класс с событием, доступным в Pascal Script, и мне нужно передать этот интерфейсный объект этой процедуре, как указано выше, поэтому сначала я попытался объявить во время компиляции это (, но я даже не уверен, что это правильный способ сделать это):

// the interface
PS.AddInterface(Cl.FindInterface('IUnknown'), StringToGuid('{57F85BA4-CB01-4466-8441-948D03588F54}'), 'IGPGraphics');
// the type for the event
PS.AddTypeS('TRenderEvent', 'procedure(Sender: TObject; const GPGraphics: IGPGraphics)');
// and the class with the event itself
with PS.AddClassN(PS.FindClass('TGraphicControl'), 'TRenderClass') do
begin
  RegisterProperty('OnRender', 'TRenderEvent', iptrw);
end;

Часть среды выполнения Pascal Script:

Где я определенно потерялся, так это во время выполнения. Я не могу понять, как получить интерфейсный объект из стека вызовов и передать его моей процедуре RenderObject:

function RenderClassProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, 
  Stack: TPSStack): Boolean;
var
  PStart: Cardinal;
begin
  PStart := Stack.Count-1;
  Result := True;
  if Proc.Name = 'RENDEROBJECT' then
  begin
    // how do I get the interfaced object from Stack (or whatever else) and pass 
    // it to the RenderObject proc here ? I can't find anything related about it
    // except functions that has no parameter index
    RenderObject(Stack.Get ?, Stack.GetInt(PStart-2), Stack.GetInt(PStart-3));
  end;
end;

И вопрос:

Может ли кто-нибудь предложить мне, как правильно определить часть компиляции и времени выполнения для этого случая или исправить меня, как-то передав интерфейсный объект?

P.S. извините за этот тег Inno -Setup, но, возможно, кто-то оттуда пытался настроить InnoSetup таким образом.

Большое спасибо!

7
задан TLama 12 July 2012 в 16:30
поделиться