gpt4 book ai didi

delphi - 在 Delphi 中使用 dispInterface 且没有 classid

转载 作者:行者123 更新时间:2023-12-03 15:58:11 28 4
gpt4 key购买 nike

我已将一个类型库导入到具有许多调度接口(interface)的 Delphi XE2 中。他们中的大多数都有一个自动创建的组件类并自动创建相应的delphi T 接口(interface)。

但是,我需要使用的一些调度接口(interface)没有 classid;我已经尝试了在网上可以找到的所有示例来利用相关的调度接口(interface)。界面如下所示:

DIID_ITableListener: TGUID = '{83D42EA5-2C18-46EB-823B-262D62DF8CF1}';
...
ITableListener = dispinterface;
...
// *********************************************************************//
// DispIntf: ITableListener
// Flags: (4096) Dispatchable
// GUID: {83D42EA5-2C18-46EB-823B-262D62DF8CF1}
// *********************************************************************//
ITableListener = dispinterface
['{83D42EA5-2C18-46EB-823B-262D62DF8CF1}']
procedure Added(const rowID: WideString; const rowDataObj: IRow); dispid 1610743809;
procedure Changed(const rowID: WideString; const rowDataObj: IRow); dispid 1610743810;
procedure Deleted(const rowID: WideString; const rowDataObj: IRow); dispid 1610743811;
procedure StatusChanged(status: TableStatus); dispid 1610743812;
end;

以下是使用此调度接口(interface)的类型库包装器中另一个接口(interface)的示例:

procedure subscribeUpdate(updateType: TableUpdateType; const listenerObj: ITableListener);

这里提供了一个 VB.NET 示例,解释了如何使用调度接口(interface):

' If you want to use methods of the ITableListener interface, you must create a 
' class that+ implements the interface. For example,

public class TableListener implements ITableListener { }

' In your application you must create an instance of the class that implements
' the interface. For example,

TableListener tableListener = new TableListener();

如果没有 ClassID,我如何在 Delphi 中实现它?我如何进行实例化?我认为这与实现 IDispatch 接口(interface)后代有关,但同样没有 ClassID,我找不到方法来完成这项工作。

救命!

谢谢。

最佳答案

所以我浏览了 the link 中提供的示例,并将您的接口(interface)替换为链接中的接口(interface),并得出以下结果:

ITableListener = dispinterface
['{83D42EA5-2C18-46EB-823B-262D62DF8CF1}']
procedure Added(const rowID: WideString; const rowDataObj: IRow); dispid 1610743809;
procedure Changed(const rowID: WideString; const rowDataObj: IRow); dispid 1610743810;
procedure Deleted(const rowID: WideString; const rowDataObj: IRow); dispid 1610743811;
procedure StatusChanged(status: TableStatus); dispid 1610743812;
end;

IMyTableListener = interface(IDispatch)
['{INSERT ARBITRARY GUID HERE}']
procedure Added(const rowID: WideString; const rowDataObj: IRow);
procedure Changed(const rowID: WideString; const rowDataObj: IRow);
procedure Deleted(const rowID: WideString; const rowDataObj: IRow);
procedure StatusChanged(status: TableStatus);
end;


TMyTableListener = class (TAutoObject, IMyTableListener)
public
procedure Added(const rowID: WideString; const rowDataObj: IRow);
procedure Changed(const rowID: WideString; const rowDataObj: IRow);
procedure Deleted(const rowID: WideString; const rowDataObj: IRow);
procedure StatusChanged(status: TableStatus);
end;

{ ... }
var
Disp: IDispatch;
Dispint: ITableListener;
{ ... }
// this may require that TMyTableListener is registered...
Disp := CreateComObject(TMyTableListener) as IDispatch;
// alternatively, try this (not sure about syntax):
Disp := new TMyTableListener as IDispatch;
Disp.AddRef(); // in C++, at least, creating the class via new() results in a 0 refcount, so you need to AddRef() so that releasing the object destroys the object appropriately...
Dispint := ITableListener(Disp);
subscribeUpdate(updateType, Dispint);
{ ... }

关于delphi - 在 Delphi 中使用 dispInterface 且没有 classid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21564282/

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