我用的是Delphi7,在DLL中生成一无模式窗体,引出创建和关闭窗体的两个函数,代码如下
function CreateMyForm(AHandle:THandle):longint;
var
DLLForm: TMyForm;
begin
Application.Handle := AHandle;
DLLForm := TMyForm.Create(Application);
Result := Longint(DLLForm);
DLLForm.Show;
end;
procedure CloseMyForm(AFormRef: Longint);
begin
if AFormRef > 0 then
TMyForm(AFormRef).Release;
end;然后在我的测试程序中使用这两个函数,代码如下:
unit frmMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMainForm = class(TForm)
btnCreate: TButton;
btnClose: TButton;
procedure btnCreateClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
private
{ Private declarations }
FFormRef:TForm;
public
{ Public declarations }
end;var
MainForm: TMainForm;function CreateMyForm(AHandle:THandle):Longint;stdcall;
external 'MyLib.dll';
procedure CloseMyForm(AFormRef: Longint);stdcall;
external 'MyLib.dll';
implementation{$R *.dfm}procedure TMainForm.btnCreateClick(Sender: TObject);
begin
if not Assigned(FFormRef) then
FFormRef := TForm(CreateMyForm(Application.Handle));
end;procedure TMainForm.btnCloseClick(Sender: TObject);
begin
if Assigned(FFormRef) then
begin
CloseMyForm(Longint(FFormRef));
FFormRef := nil;
end;
end;end.现在问题是:
当我点击btnCreate按钮创建窗体,再点btnClose关闭窗体时,然后退出程序,一切正常
但当我点btnCreate按钮创建窗体,不关闭窗体直接退出程序时,就会出现错误提示:project DllTest.exe raised too many consecutive exceptions:'access violation at 0x002332d6:read of address 0x00d32850.'
即使我在MainForm.Destroy事件中加上关闭窗体的代码,也会出现同样的错误。
请问这是什么原因??应该怎样解决??谢谢
function CreateMyForm(AHandle:THandle):longint;
var
DLLForm: TMyForm;
begin
Application.Handle := AHandle;
DLLForm := TMyForm.Create(Application);
Result := Longint(DLLForm);
DLLForm.Show;
end;
procedure CloseMyForm(AFormRef: Longint);
begin
if AFormRef > 0 then
TMyForm(AFormRef).Release;
end;然后在我的测试程序中使用这两个函数,代码如下:
unit frmMain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMainForm = class(TForm)
btnCreate: TButton;
btnClose: TButton;
procedure btnCreateClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
private
{ Private declarations }
FFormRef:TForm;
public
{ Public declarations }
end;var
MainForm: TMainForm;function CreateMyForm(AHandle:THandle):Longint;stdcall;
external 'MyLib.dll';
procedure CloseMyForm(AFormRef: Longint);stdcall;
external 'MyLib.dll';
implementation{$R *.dfm}procedure TMainForm.btnCreateClick(Sender: TObject);
begin
if not Assigned(FFormRef) then
FFormRef := TForm(CreateMyForm(Application.Handle));
end;procedure TMainForm.btnCloseClick(Sender: TObject);
begin
if Assigned(FFormRef) then
begin
CloseMyForm(Longint(FFormRef));
FFormRef := nil;
end;
end;end.现在问题是:
当我点击btnCreate按钮创建窗体,再点btnClose关闭窗体时,然后退出程序,一切正常
但当我点btnCreate按钮创建窗体,不关闭窗体直接退出程序时,就会出现错误提示:project DllTest.exe raised too many consecutive exceptions:'access violation at 0x002332d6:read of address 0x00d32850.'
即使我在MainForm.Destroy事件中加上关闭窗体的代码,也会出现同样的错误。
请问这是什么原因??应该怎样解决??谢谢
解决方案 »
- 安装Delphi7.0问题出现了问题 求助大家~
- 求dream designer的解压密码
- 帮帮看看错在哪里了~~~~~~~~~~~~`
- 高手请进,delphi如何访问一个excel中单元格的内容?
- 急....寻找checktree但是要能连接到数据库的...请各位帮帮忙
- 有高手吗?高分求解一个常见报表的问题?
- 怎么限制一个edit控件只接收数字,不接受其他字符?
- 没分了,请大家帮忙!
- Delphi+Mysql(如何将一个二进制文件保存到mysql数据库中?)
- 请教关于DLL中string参数传递的问题。谢谢
- Win9x/Win2000/XP下如何得知当前机器的BIOS是哪个厂商的?Award、AMI或者Phonix的?
- 急,我在操作局域网那另一台机器上数据库中的存储过程的时候.
DLLForm: TMyForm;procedure CreateMyForm(AOwner:TComponent);
begin
if not Assigned(DLLForm) then
DLLForm := TMyForm.Create(AOwner);
DLLForm.Show;
end;
调动:
CreateMyForm(Application);
procedure ShowDllForm; stdcall;
begin
if frmDllForm = nil then
frmDllForm := TfrmDllForm.Create(nil);
frmDllForm.Show;
end;
我的代码也能将Form显示,但是在关闭程序时出现问题,请看清问题,谢谢
external 'MyLib.dll'
====================================================
procedure CloseMyForm(AFormRef: Longint);stdcall;
external 'MyLib.dll' name 'CloseMyForm';