我在DLL入口函数中这样创建一个对象不可以么?为什么总是出错?呼唤高手!!在线等待~~~

rzg 2003-08-06 10:43:17
我在DLL入口汉书中这样创建一个对象不可以么?为什么总是出错?呼唤高手!!
var
DLLApp: TApplication;
DLLScr: TScreen;

procedure OnDLLLoad(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
DLLApp := Application;
DLLScr := Screen;
//在DLL启动的时候创建数据模块对象。
if DM=nil then
DM := TDM.Create(Application);
end;
DLL_PROCESS_DETACH:
begin
Application := DLLApp;
Screen := DLLScr;
//在DLL启动的时候创建释放该对象。
if DM<>nil then
FreeAndNil(DM);
end;
end;
end;

procedure ConnDatabase(ADOC:TADOConnection);
begin
DM.ADOC := ADOC;
end;

exports
ConnDatabase;

begin
DLLProc := @OnDLLLoad;
OnDLLLoad(DLL_PROCESS_ATTACH);

end.
在动态连接库调用时退出程序总会有异常触发!
...全文
46 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
movingboy2 2003-08-06
  • 打赏
  • 举报
回复
1.在你的DLL工程文件的begin...End.中保存Application对象,如

DllApp := Application; //这里的Application是DLL的Application

2.在你输出的函数的参数中增加一个参数,类型为TApplication(如MainApp: TApplication),该参数应该传入主调程序(调用DLL的exe)的Application对象

3.在你输出的函数中用传入的Application对象替代Dll的Application对象,如

Application := MainApp; //MainApp是主调程序的Application

4.在你输出的函数中检查你的数据模块是否已创建,如果没有,就创建。如果它的Owner指定为Application,就不需要自己释放,否则要自己做

5.在你的Detach方法中(即你的例子中的OnDLLLoad的DLL_PROCESS_DETACH部分)恢复Dll的原Application对象,如

Application := DllApp; //DllApp是DLL原来的Application

6.应该行了

PS:实际上DLL的Application是nil,你跟踪一下看看。
PPS:你的OnDLLLoad最好加上register指示字
wooden954 2003-08-06
  • 打赏
  • 举报
回复
不了解,但帮你Up一下吧!

5,392

社区成员

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

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