delphi7调用DLL与DELPHI6不同吗,程序是书本上的例子,如下通不过;马上给分

hyh128 2003-08-13 09:58:32
library DLLShowForm;

uses
SysUtils,
Classes,
DLLFrm in 'DLLFrm.pas' {frmDLL};
{$R *.res}
//输出ShowDLLModalForm,ShowDLLForm接口方法,以便外部程序调用
exports
ShowDLLModalForm, ShowDLLForm;
begin
end.

//-------------------------------------
unit DLLFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TfrmDLL = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

{声明要引出的方法}
procedure ShowDLLModalForm(aHandle: THandle); stdcall; //模式显示窗口
procedure ShowDLLForm(aHandle: THandle); stdcall; //非模式显示窗口

implementation

{$R *.dfm}

//模式显示窗口
procedure ShowDLLModalForm(aHandle: THandle);
begin
Application.Handle := aHandle; //传递应用程序句柄
with TfrmDLL.Create(Application) do //创建窗体
begin
try
ShowModal; //模式显示窗体
finally
free;
end;
end;
end;


//非模式显示窗口
procedure ShowDLLForm(aHandle: THandle);
begin
Application.Handle := aHandle; //传递应用程序句柄
with TfrmDLL.Create(application) do //创建窗体
Show; //非模式显示窗体
end;
end.

//--------调用-----------
unit MainFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
//定义DLL中引出的过程类型
TShowDLLForm = procedure(aHandle: THandle); stdcall;
EDLLError = class(Exception);
TFrmMain = class(TForm)
btnShowModal: TButton;
btnShow: TButton;
procedure btnShowModalClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnShowClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
//指向加载后DLL句柄
DLLHandle: THandle;
{ Private declarations }
public
{ Public declarations }
end;

var
FrmMain: TFrmMain;
implementation

{$R *.dfm}

//窗体创建时,加载DLL
procedure TFrmMain.FormCreate(Sender: TObject);
begin
DLLHandle := LoadLibrary('DLLShowForm.dll');
{如果DLLHandle为0,代表加载DLL失败}
if DLLHandle = 0 then
raise EDLLError.Create('不能加载DLLShowForm.dll');
end;

//窗体释放时,卸载DLL
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
FreeLibrary(DLLHandle);
end;

//模式显示窗口
procedure TFrmMain.btnShowModalClick(Sender: TObject);
var
ShowDLLModalForm: TShowDLLForm;
begin
{链接DLL中的输出函数,以被调用}
if (@ShowDLLModalForm = nil) then
RaiseLastWin32Error;
ShowDLLModalForm(Application.Handle);
end;

//非模式显示窗口
procedure TFrmMain.btnShowClick(Sender: TObject);
var
ShowDLLForm: TShowDLLForm;
begin
@ShowDLLForm := GetProcAddress(DLLHandle, 'ShowDLLForm');
if (@ShowDLLForm = nil) then
RaiseLastWin32Error;
ShowDLLForm(Application.Handle);
end;

end.
...全文
109 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyro88cn 2003-08-13
  • 打赏
  • 举报
回复
{声明要引出的方法}
procedure ShowDLLModalForm(aHandle: THandle); export; //模式显示窗口
procedure ShowDLLForm(aHandle: THandle); export; //非模式显示窗口
hare007 2003-08-13
  • 打赏
  • 举报
回复
关注
mingjunlee 2003-08-13
  • 打赏
  • 举报
回复
你说的是动态调用,先试试静态调用看看
在你的MainForm窗体中声明要调用的dll内的函数
在implementation下声明:
procedure ShowDLLModalForm(aHandle: THandle); external 'DLLShowForm.dll';
之后就可以在你的程序里调用它了
李_军 2003-08-13
  • 打赏
  • 举报
回复
//模式显示窗口
procedure ShowDLLModalForm(aHandle: THandle);
begin
Application.Handle := aHandle; //传递应用程序句柄
with TfrmDLL.Create(Application) do //创建窗体
begin
try
ShowModal; //模式显示窗体
finally
freeAndNil(frmDLL); //这样
end;
end;
end;
hyh128 2003-08-13
  • 打赏
  • 举报
回复
//非模式显示窗口为
---------------------------
Project1
---------------------------
System Error. Code: 127.

找不到指定的程序。.
---------------------------
确定
---------------------------
hyh128 2003-08-13
  • 打赏
  • 举报
回复
//模式显示窗口为
---------------------------
Project1
---------------------------
Access violation at address 00CD37AF. Write of address 005563F5.
---------------------------
确定
---------------------------



hanzq 2003-08-13
  • 打赏
  • 举报
回复
说一下那里通不过啊

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧