简单的COM/DCOM问题的一个例题如下所示,不是很懂,谁给讲一下,顺便放分!,
delphi 5开发人员指南,748页实现COM客户端的事件处理:如下代码
...
TEventSink = class(TObject, IUnknown, IDispatch)
private
FController: TMainForm;
{ IUnknown }
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
{ IDispatch }
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
public
constructor Create(Controller: TMainForm);
end;
上面代码是基于D5的,很麻烦,由于D6,D7对COM做了改进,于是在D7下改为如下:
TEventSink = class(TComponent, IUnknown, IDispatch)
private
FController: TMainForm;
function QueryInterface(const IID: TGUID; out obj): HResult; stdcall;
function Invoke(DispID: integer; const IID: TGUID; LocateID: integer;
Flags: word; var Params; varResult, ExcepInfo, ArgErr: Pointer):
HResult; stdcall;
public
constructor Create(Controller: TMainForm);
end;
经简单测试,能够正常运行!
疑惑点,
1.这样改行不行?及原因?
2.TComponent类已实现了上面所有private域的函数!
但改进的方法中又实现了一次QueryInterface及Invoke来满一些需要,看上去即不是重载也不是覆盖,是隐藏了以前实现的方法吗?
这种情况怎么处理较好?