delphi注册.net开发的COM组件中的事件 最近因为要用用Delphi调用.net开发的一个com组件,调用com组件中的方法没问题,但是注册COM组件中的事件却不会。急用,求大侠帮助!!!!!!!!!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 命令行启动: regsvr32 XXXXXX.dll 实现IDispatch接口不就行了吗?声明大概是这样function ComObj.AddEvent(const pEvent: IDispatch):HResult; stdcall;pEvent如果是自定义接口,按接口声明实现它的函数就是了,IDispatch实现如: TComEventObject = class(TObject, IDispatch) protected //IInterface 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; end;function TComEventObject.QueryInterface(const IID: TGUID; out Obj): HResult;begin if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;end;function TComEventObject._AddRef: Integer;begin Result := 1;//不使用接口的引用计数机制,自己控制释放end;function TComEventObject._Release: Integer;begin Result := 1;//不使用接口的引用计数机制,自己控制释放end;function TComEventObject.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;begin Result := E_NOTIMPL;end;function TComEventObject.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;begin Pointer(TypeInfo) := nil; Result := E_NOTIMPL;end;function TComEventObject.GetTypeInfoCount(out Count: Integer): HResult;begin Count := 0; Result := E_NOTIMPL;end;function TComEventObject.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;var param0 : Variant;begin Result := S_OK; //事件回调, DispID = 事件ID case DispID of 1 : begin //Params为参数结构体 param0 := Variant(TDispParams(Params).rgvarg^[0]);//多个参数从0开始 end; else Result := DISP_E_MEMBERNOTFOUND; end;end; 路过T场子\(^o^)/~ group by 问题!! 当一个程序在托盘时怎么让它在使用键盘快捷键如Ctrl+Alt+Z来让程序显示在桌面上? dll中如何定义变参,不够可以加分,绑定有分 请问各位达人——DEPHI7的自带压缩控件是哪个? 关于记录的筛选!!! 有对三层有兴趣的请进 大家帮我看看。 为什么SQL SERVER的内存会不断增加 在DELPHI6中如何安装组件和控件,我想要详细方法? DELPHI 中clientsocket控件在什么地方? OleContainer如何选择默认的Office对象?
命令行启动: regsvr32 XXXXXX.dll
function ComObj.AddEvent(const pEvent: IDispatch):HResult; stdcall;pEvent如果是自定义接口,按接口声明实现它的函数就是了,IDispatch实现如:
TComEventObject = class(TObject, IDispatch)
protected
//IInterface
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;
end;function TComEventObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;function TComEventObject._AddRef: Integer;
begin
Result := 1;//不使用接口的引用计数机制,自己控制释放
end;function TComEventObject._Release: Integer;
begin
Result := 1;//不使用接口的引用计数机制,自己控制释放
end;function TComEventObject.GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
Result := E_NOTIMPL;
end;function TComEventObject.GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
begin
Pointer(TypeInfo) := nil;
Result := E_NOTIMPL;
end;function TComEventObject.GetTypeInfoCount(out Count: Integer): HResult;
begin
Count := 0;
Result := E_NOTIMPL;
end;function TComEventObject.Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
ArgErr: Pointer): HResult;
var
param0 : Variant;
begin
Result := S_OK;
//事件回调, DispID = 事件ID
case DispID of
1 :
begin //Params为参数结构体
param0 := Variant(TDispParams(Params).rgvarg^[0]);//多个参数从0开始
end;
else
Result := DISP_E_MEMBERNOTFOUND;
end;
end;