调用DLL,主程序退出时,出现非法操作?(200分)

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

xac

Unregistered / Unconfirmed
GUEST, unregistred user!
就下面的代码,我在调用时,能正常显示DLL 中MDI窗体
可是在,主程序退出时,就会出现非法操作,216 错误,
各位高手能帮我我看看吗?

'0x00fa34aa'指令引用0x01003398内存,该内存不能为"read"

Runtime Error 216 at 00fa34aa

动态库如下:
library ProjectDll;

uses
Windows,
SysUtils,
Classes,
Controls,
Forms,
UnitDll in 'UnitDll.pas' {Form1};

procedure CreateChild(ParentApplication: TApplication
ParentForm: TForm;ParentScreen:TScreen)
export
stdcall;
var
Form1: Tform1;
begin
Screen:=ParentScreen;
Application:=ParentApplication;
Form1:=TForm1.Create(ParentForm);
Form1.Caption:='Title';
Form1.Show;
end;
exports
CreateChild;

begin
end.

============================================
unit UnitDll;

interface

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

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


implementation

{$R *.dfm}

end.
==========================================
调用:
unit ld2;

interface

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

type
T_ProvaChild=procedure (ParentApplication:Tapplication;ParentForm:Tform;ParentScreen:Tscreen);stdcall;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}



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

end.

 
procedure CreateChild(ParentApplication: TApplication
ParentForm: TForm;ParentScreen:TScreen)
export
stdcall;
var
Form1: Tform1;
begin
Screen:=ParentScreen;
Application:=ParentApplication;
Form1:=TForm1.Create(ParentForm);
Form1.Caption:='Title';
try
Form1.Showmodal;
finally
Form1.Free
//释放窗体
end;

end;
//加入下面 code
procedure DLLUnloadProc(Reason: Integer)
register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;

{$R *.res}
exports
CreateChild;
begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.
试试!
 
应在DLL中释放掉Form对象。
 
DLLAPPLICATION是什么东西?
 
to WeekBoy:
我要显示MDI窗体,不能用Modal.
你的代码,就是我在D5时用的,现在
我把同样的代码放在D6中就出错。
 
做一个FreeChild
 
我是这样用的:
TF_Showjyrkdj = function (App:TApplication;PFormFreeCallBack:Pointer):TForm;stdcall;
Showjyrkdj :TF_Showjyrkdj;
Form:=Showjyckdj(Application,@FormFreeCallBackjyckdj);
dlldbhWndjyckdj:=loadLibrary('pjyckdj.dll');
Showjyckdj:=getProcAddress(dlldbhWndjyckdj,'Showjyckdj');
if @showjyckdj=Nil then begin
Raise EDLLLoadError.create(IntToStr(LastError) +
': 模块函数调用错误');
end;
 
在调用部分末尾加上FreeLibrary(DllHandle);
 
to xac
我也有同样的经历(很惨痛)
D6中
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
无效
procedure DLLUnloadProc(Reason: Integer)
register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;
根本就不运行


 
我现在,也没有搞定这个问题,
问题是不知道如何去找到这个问题的根源.

我现在试着用Package,我看到一个讲BCB的书上,有例子.

 
d6 的update2

DllApplication:=Application;
DLLProc := @DLLUnloadProc;
有效了

 
哪有update2下载呢?
我也有这个问题啊。
 
看看d动态连接库工程文件中的注释吧!
libiary *** 后面的部分(英文),
Delphi告诉我们最好用Shortstring或 Pchar代替string类型的传入参数。
而且,在工程源文件(project->view source调出)加入,ShareMem,并且在第一行。
你自己的Dll文件中ShareMem也是这个位置。试试吧。:)
还有,不呀忘了在系统发行时,带上BORLNDMM.DLL。
 
后退
顶部