gpt4 book ai didi

delphi - 如何将接口(interface)对象传递给 Pascal Script 函数调用?

转载 作者:行者123 更新时间:2023-12-03 14:54:30 28 4
gpt4 key购买 nike

Delphi 部分:

我有一个包含该事件的类,并且从该事件中我需要调用一个将接口(interface)对象传递给它的过程。它在 Delphi 中工作正常,但我在 Pascal Script 中声明它时遇到问题。

到后台 - IGPGraphics 界面是 Delphi GDI+ library 的一部分没有方法的定义如下:

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

以下只是我需要在 Pascal Script 中执行的操作的简化 Delphi 伪代码:

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 脚本编译部分:

我的目标是让类在 Pascal Script 中可用,并且需要将接口(interface)对象传递给该过程,就像上面一样,所以我第一次尝试在编译时声明这个(但我不是即使确定这是否是正确的方法):

// 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 运行时部分:

我绝对迷失的是运行时部分。我不知道如何从调用堆栈中获取接口(interface)对象并将其传递给我的 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;

问题是:

任何人都可以建议我如何正确定义这种情况下的编译和运行时部分,或者通过某种方式传递接口(interface)对象来纠正我?

附注对于 Inno-Setup 标签感到抱歉,但也许有人来自那里尝试以这种方式自定义 InnoSetup。

非常感谢!

最佳答案

如果我明白你在问什么,你想将接口(interface)作为参数传递给方法。不幸的是,我没有确切的答案,但我确实知道如何将接口(interface)分配给 PascalScript 的全局变量。以下是我在 Castalia 中的操作方法:

在 PSScript OnCompile 事件中,使用 PS.Comp.AddInterface 添加接口(interface),然后添加每个必要的方法。之后,添加一个接口(interface)类型的变量。例如,它看起来像这样:

with PS.Comp.AddInterface(ARunner.Comp.FindInterface('IUnknown'),
StringToGUID('{0346F7DF-CA7B-4B15-AEC9-2BDD680EE7AD}'),
'ICastaliaMacroClipboardAccess') do
begin
RegisterMethod('function GetText: string', cdRegister);
RegisterMethod('procedure SetText(AText: string)', cdRegister);
end;
PS.AddRegisteredVariable('Clipboard', 'ICastaliaMacroClipboardAccess');

然后,在 OnExectute 事件中,将之前创建的变量绑定(bind)到实例:

P := PS.GetVariable('Clipboard'); //P is type PIFVariant
SetVariantToInterface(P, Implementing object as ICastaliaMacroClipboardAccess);

完成此操作后,脚本可以通过变量访问接口(interface)对象,因此在本例中,脚本可以包含对 Clipboard.GetText 的调用,并且它会按您的预期工作。

经过测试并且有效。

现在,我推测您也许可以使用 TPSScript.ExecuteFunction,从上面传入 PIFVariant,以更接近您想要的结果。不过,这不是我测试过的。

祝你好运!

关于delphi - 如何将接口(interface)对象传递给 Pascal Script 函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11453841/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com