问一个动态连接库的问题, ( 积分: 20 )

  • 主题发起人 主题发起人 xuzhic2001
  • 开始时间 开始时间
X

xuzhic2001

Unregistered / Unconfirmed
GUEST, unregistred user!
在网上找到一个用dll创建子窗体的例子.可是有个地方看不懂
unit MainUnit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ToolWin, ComCtrls, Menus;

type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
Start: TMenuItem;
procedure StartClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;///就是这句话,不明白这个写法是什么意思?

var
MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.StartClick(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild;
begin
DllHandle := LoadLibrary('ProjectDll');
ProcAddr := GetProcAddress(DllHandle, 'ProvaChild');
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(Application,Self);
end;
end;

end.
 
T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;///就是这句话,不明白这个写法是什么意思?
这个表示 T_ProvaChild 这一个过程类型 ,

你可以定义这个过程的变量(实际上是一个指针),通过过程的变量去执行一个过程
procedure TMainForm.StartClick(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild; // 定义了一个吧
begin
DllHandle := LoadLibrary('ProjectDll');
ProcAddr := GetProcAddress(DllHandle, 'ProvaChild');
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr; // 取得了地址
ProvaChild(Application,Self); // 强制转换,去执行一个过程
end;
end;

end.
 
接受答案了.
 
后退
顶部