我想知道是否有可能在Delphi 2010 RIDL编辑器中定义函数/过程指针类型的属性,用于接口定义,这样当我使用其CoCreator创建其实施者的实例时,我可以在我的源代码中分配使用该接口定义的函数/过程到该属性。实际上我想知道如何填充"??
TLB文件:
IComIntf = interface(IDispatch)
...
function Get_OnDoSomething : ??? safecall;
procedure Set_OnDoSomething(const New_Event : ???); safecall;
...
property OnDoSomething : ???;
...
implementation
uses ComObj;
class function CoComIntf.Create: IComInt;
...
begin
Result := CreateComObject(CLASS_ComIntf) as IComIntf;
end;
ComIntfUnit.pas:
type
TOnDoSomething = function (Info: OleVariant): HResult of object;
TComIntf = class(TAutoObject, IComIntf)
private
fOnDoSomething : TDoSomething;
...
public
property OnDoSomething: TOnDoSomething read fOnDoSomething write fOnDoSomething;
...
客户端形式:
uses ComIntfUnit;
type
TForm1 = class(TForm)
private
{ Private declarations }
fCom : IComIntf;
function DoSomething(Info: OleVariant): HResult;
public
{ Public declarations }
...
end;
...
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
fCom := CoComIntf.Create;
fCom.OnDoSomething := DoSomething;
...
提前感谢。
原始函数指针不是COM兼容的类型。如果你愿意,你当然可以使用一个空指针,但这并不符合COM的精神。
你在这里要做的是传递另一个接口。然后,被调用方可以调用该接口上的函数,并执行调用方的代码。
你走错路了。实现这一点的正确方法是定义客户端实现并传递给COM对象的第二个接口。然后,COM对象可以保持该接口,并在需要时调用该接口的方法。这通常是使用事件接口的连接点来实现的。
实现这一点的一个简单方法,特别是因为您正在使用IDispatch
,是使用IDE向导创建一个新的自动化对象,并确保单击向导对话框中的"生成事件支持代码"复选框。然后向导将生成2个接口,一个用于对象本身,另一个用于对象的事件,并为您实现连接点逻辑。然后,您可以根据需要向两个接口添加方法,其中对象方法在需要时调用事件方法。
如果您随后编译、注册并将最终对象导入到IDE中,并为其生成VCL包装器,则生成的组件将具有VCL样式的事件,这些事件在内部与对象的连接点事件相关联。