单元A: unit PubFunction;interfaceuses Windows, Forms;Type TDoQuery=procedure (H:Thandle;mUserName:PChar;mPopo:Variant;UnitFlag:Integer;ModuleFlag:PChar);StdCall; 调用: procedure TframeEmpManager.fbCxhmcClick(Sender: TObject); var LibHandle:THandle; mProc:TDoQuery; begin LibHandle:=LoadLibrary('MyQuery.dll'); try if LibHandle<>0 then begin @mProc:=GetProcAddress(LibHandle,'DoQuery'); if @mProc<>nil then mProc(Handle,Pchar(User.UserID),vLogin,1,PChar('110200')); end; finally FreeLibrary(LibHandle); end; end;
unit PubFunction;interfaceuses Windows, Forms;Type
TDoQuery=procedure (H:Thandle;mUserName:PChar;mPopo:Variant;UnitFlag:Integer;ModuleFlag:PChar);StdCall;
调用:
procedure TframeEmpManager.fbCxhmcClick(Sender: TObject);
var
LibHandle:THandle;
mProc:TDoQuery;
begin
LibHandle:=LoadLibrary('MyQuery.dll');
try
if LibHandle<>0 then
begin
@mProc:=GetProcAddress(LibHandle,'DoQuery');
if @mProc<>nil then mProc(Handle,Pchar(User.UserID),vLogin,1,PChar('110200'));
end;
finally
FreeLibrary(LibHandle);
end;
end;
是对象的方法比如: AProcMethod:procedure(Sender:TObject) of object;为什么一定要加上of object呢?实际上,Object Pascal中一般的函数指针就相当于普通的指针,而AProcMethod则是一个对指针,它在Delphi中有一个对应的类型:TMethod。TMethod=record Data, Code:Pointer;end;所以,我们在单元中可以这样:procedure TForm1.Button1Click2(Sender:TObject);begin ShowMessage(‘Click2!’);end; procedure TForm1.FormCreate(Sender:TObject);var Method:TMethod;begin Method.Data := Self; Method.Code := MethodAddress(‘Button1Click2’); Button1.OnClick := TNotifyEvent(Method);end;当然,实际上只需要Button1.OnClick=Button1Click2即可;不过,这样可以让你明白在幕后发生的事情。值得注意的一点是,Button1Click2应该声明在published段(或者和其他构件的声明放在一起,因为默认作用域就是published),以便编译器为它产生RTTI信息,否则程序可能达不到预期的效果。