-->怎样调用BPL包中的过程??? 在DLL中可以用exports导出过程,再用GetProcAddress获得过程地址,可在包中不能使用exports,怎么办??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BPL好像不行吧!!! 关注ing 在BPL中和DLL中一样的除了BPL加载不是用loadlibrary,而是用LoadPackage(),再用GetProcAddress获得过程地址 好!我来试试:一、在包中新建一个窗体单元,提供输出的函数,过程。unit frmDemo;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TDemoForm = class(TForm) Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; {声明函数和过程}procedure SayHello;stdcall;function Add(a1,a2:Integer):Integer;stdcall;{导出函数和过程}exports SayHello, Add;var DemoForm: TDemoForm;implementation{$R *.dfm}procedure SayHello;begin ShowMessage('你好!');end;function Add(a1,a2:Integer):Integer;begin Result:=a1+a2;end;procedure TDemoForm.Button1Click(Sender: TObject);begin Self.close;end;initialization RegisterClass(TDemoForm);finalization UnRegisterClass(TDemoForm);end. 接上,二、在主程序中调用包中的对象以及函数过程具体见代码如下:unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB,ADODB;type TMainForm = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } PackageModule: HModule; public { Public declarations } end; {声明函数和过程} TAddFunc = function(a1,a2:Integer):Integer;stdcall; TSayHelloProc = procedure;stdcall;var MainForm: TMainForm;implementationuses DemoClassInt;{$R *.dfm}procedure TMainForm.FormCreate(Sender: TObject);begin try PackageModule:=LoadPackage('DemoPackage.bpl') except On E:Exception do begin MessageBeep(Word(-1)); ShowMessage(E.Message); Application.Terminate; end; end;end;procedure TMainForm.FormDestroy(Sender: TObject);begin if PackageModule <> 0 then UnloadPackage(PackageModule);end;{Package中函数的调用}procedure TMainForm.Button1Click(Sender: TObject);var AddFunc:TAddfunc; value:Integer; a1,a2:Integer;begin @AddFunc:=GetProcAddress(PackageModule,PChar('Add')); if @AddFunc <> nil then begin Value:=AddFunc(2,2); showMessage('结果是:'+IntToStr(Value)); end;end;{Package中过程的调用}procedure TMainForm.Button2Click(Sender: TObject);var SayHelloProc:TSayHelloProc;begin @SayHelloProc:=GetProcAddress(PackageModule,PChar('SayHello')); if @SayHelloProc<>nil then SayHelloProc;end;end. delphi7 DBGrid列宽设置不起作用 我用了一个循环,但是却得出相同的结果,是怎么回事啊? DBChart的小问题 打印控制 请大家进来看看,在线等待…… 这个算法怎么做?(建筑) 请问:恢复数据库不出错,但是检查数据根本没有恢复?为什么? 欢迎到我的网站下载好东西! 帮帮忙吧,大虾们 关于dephi 中报表打印的问题 请问谁知道 BugTrace 软件?在那儿有下载? 分数统计
除了BPL加载不是用loadlibrary,而是用LoadPackage(),再用GetProcAddress获得过程地址
unit frmDemo;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TDemoForm = class(TForm)
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
{声明函数和过程}
procedure SayHello;stdcall;
function Add(a1,a2:Integer):Integer;stdcall;{导出函数和过程}
exports
SayHello,
Add;
var
DemoForm: TDemoForm;implementation{$R *.dfm}
procedure SayHello;
begin
ShowMessage('你好!');
end;function Add(a1,a2:Integer):Integer;
begin
Result:=a1+a2;
end;procedure TDemoForm.Button1Click(Sender: TObject);
begin
Self.close;
end;initialization
RegisterClass(TDemoForm);
finalization
UnRegisterClass(TDemoForm);
end.
二、在主程序中调用包中的对象以及函数过程
具体见代码如下:
unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB,ADODB;type
TMainForm = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
PackageModule: HModule;
public
{ Public declarations }
end;
{声明函数和过程}
TAddFunc = function(a1,a2:Integer):Integer;stdcall;
TSayHelloProc = procedure;stdcall;
var
MainForm: TMainForm;implementation
uses
DemoClassInt;
{$R *.dfm}procedure TMainForm.FormCreate(Sender: TObject);
begin
try
PackageModule:=LoadPackage('DemoPackage.bpl')
except
On E:Exception do
begin
MessageBeep(Word(-1));
ShowMessage(E.Message);
Application.Terminate;
end;
end;
end;procedure TMainForm.FormDestroy(Sender: TObject);
begin
if PackageModule <> 0 then
UnloadPackage(PackageModule);
end;{Package中函数的调用}
procedure TMainForm.Button1Click(Sender: TObject);
var
AddFunc:TAddfunc;
value:Integer;
a1,a2:Integer;
begin
@AddFunc:=GetProcAddress(PackageModule,PChar('Add'));
if @AddFunc <> nil then
begin
Value:=AddFunc(2,2);
showMessage('结果是:'+IntToStr(Value));
end;
end;
{Package中过程的调用}
procedure TMainForm.Button2Click(Sender: TObject);
var
SayHelloProc:TSayHelloProc;
begin
@SayHelloProc:=GetProcAddress(PackageModule,PChar('SayHello'));
if @SayHelloProc<>nil then
SayHelloProc;
end;
end.