搜索了好多的帖子,有关于DLL中Datamodule的使用的,
但是很少清晰说到何时创建和销毁才可以保证内存不泄漏的。因为自己是菜鸟,一直没有办法搞清楚应该怎么样写才是对的?
哪位大虾给个正确的答案吧!!help!!====================================================1。比较多讲到的就是说像TForm一样的使用,但是说道的通常都
只是在一个函数中create,然后立即free,如果多过一个函数用到
的则没有例子。DM中的控件通常都不是只在一个函数中使用的,
而且函数的调用顺序不一定固定,无办法写定在哪个函数中create,
然后那个函数中free。=================================================2。有些提到可以通过在initialization和finalization中处理。
(好像不行啊?)
initialization
if not Assigned(Dmmain) then DMMain :=TDMMain.Create(Application);
finalization
if Assigned(Dmmain) then
begin
DMMain.Free;
end;===========================================3。有的就提到可以在DLLProc 中进行处理
在dll的DLLMAIN函数内创建和释放DataMoudle,如:
procedure DLLMain(dwReason:DWORD);
begin
case dwReason of
DLL_PROCESS_DETACH :
begin
if Dm <> nil then
begin
Dm:=nil;
end;
end;
DLL_PROCESS_ATTACH :
begin
if not Assigned(Dm) then
Dm:=TDm.Create(Application);
end;
DLL_THREAD_ATTACH :
begin
end;
DLL_THREAD_DETACH :
begin
end;
end;
end;
{$R *.RES}begin
DLLProc := @DLLMain;
DLLMain(DLL_PROCESS_ATTACH);
end.end==============================================4。一些则讲到可以不用自己销毁,系统会自动销毁。
(Application是不是还需要在程序外传进来的?)
1)创建时:
"用DLL把Datamodule打包,只要在DLL的入口初始化Datamodule就好了."
//dll主程序
library erpsend;uses
SysUtils,
Classes,
Forms,
DMDatain DMData.pas' {DM: TDataModule};
{$R *.res}exportsbegin
Application.CreateForm(TDM, DM);
end.2)销毁情况:
"不需要自己手动调用,DLL卸载时会自动Free,不相信可以在DM.OnDestroy
中写点代码,然后调试再一下看,结果是会执行到OnDestroy的!"(不知道是不是可行?)
但是很少清晰说到何时创建和销毁才可以保证内存不泄漏的。因为自己是菜鸟,一直没有办法搞清楚应该怎么样写才是对的?
哪位大虾给个正确的答案吧!!help!!====================================================1。比较多讲到的就是说像TForm一样的使用,但是说道的通常都
只是在一个函数中create,然后立即free,如果多过一个函数用到
的则没有例子。DM中的控件通常都不是只在一个函数中使用的,
而且函数的调用顺序不一定固定,无办法写定在哪个函数中create,
然后那个函数中free。=================================================2。有些提到可以通过在initialization和finalization中处理。
(好像不行啊?)
initialization
if not Assigned(Dmmain) then DMMain :=TDMMain.Create(Application);
finalization
if Assigned(Dmmain) then
begin
DMMain.Free;
end;===========================================3。有的就提到可以在DLLProc 中进行处理
在dll的DLLMAIN函数内创建和释放DataMoudle,如:
procedure DLLMain(dwReason:DWORD);
begin
case dwReason of
DLL_PROCESS_DETACH :
begin
if Dm <> nil then
begin
Dm:=nil;
end;
end;
DLL_PROCESS_ATTACH :
begin
if not Assigned(Dm) then
Dm:=TDm.Create(Application);
end;
DLL_THREAD_ATTACH :
begin
end;
DLL_THREAD_DETACH :
begin
end;
end;
end;
{$R *.RES}begin
DLLProc := @DLLMain;
DLLMain(DLL_PROCESS_ATTACH);
end.end==============================================4。一些则讲到可以不用自己销毁,系统会自动销毁。
(Application是不是还需要在程序外传进来的?)
1)创建时:
"用DLL把Datamodule打包,只要在DLL的入口初始化Datamodule就好了."
//dll主程序
library erpsend;uses
SysUtils,
Classes,
Forms,
DMDatain DMData.pas' {DM: TDataModule};
{$R *.res}exportsbegin
Application.CreateForm(TDM, DM);
end.2)销毁情况:
"不需要自己手动调用,DLL卸载时会自动Free,不相信可以在DM.OnDestroy
中写点代码,然后调试再一下看,结果是会执行到OnDestroy的!"(不知道是不是可行?)
解决方案 »
- delphi2007 老说找不到 adortl100 怎么办??
- 如何获取dll中按钮的click事件
- 一个程序怎样保存两个ini文件?
- 为什么我的帮助里面找不到了我想要的东西的?急啊!
- 菜鸟,请问语言基础问题~~~~~
- 高分相送!!!!! 急问QuickReport做的报表(里面包含表格)能不能存成rtf格式?
- 请问通过dbgrid和navigate输入数据对输入的数据的验证该怎样做
- 请问一下有什么能在delphi2009下用的加密解密的控件或算法接口什么的? 以前用的AES在delphi 2009里不能用了. 谢谢.
- 请问 当数据集里面的记录指针移动时,触发什么事件
- Delphi如何访问DirectUIHWND窗体?
- 100分请教: 将数据库备份后将数据文件刻录到光盘,能否直接在光盘上操作该数据文件?
- 请大家帮帮忙!在此表示感谢!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, Buttons,ActiveX;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
LinkMode:String;
Apps:variant;
end;var
Form1: TForm1; procedure showform;export;
Function GetRegInfo(Flag:Integer):ShortString;external 'OPUHIS.DLL';
implementationuses Unit2;{$R *.dfm}
procedure showform;
begin
CoInitialize(Nil);
DataModule2 := TDataModule2.Create(Application);
Form1:=TForm1.Create(Application);
with Form1 do begin
ShowModal;
CoUnInitialize;
DataModule2.Free;
Free;
end;
end;