搜索了好多的帖子,有关于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的!"(不知道是不是可行?)

解决方案 »

  1.   

    在DLL中使用DataModule会有一些问题。
      

  2.   

    如果多个窗体共用一个DM,那在DLL入口出创建
      

  3.   

    我主要是为了将socket中的idTCPclient写成DLL,那么客户就可以不用写socket通讯的内容就可以调用普通函数的方式来获取服务器数据。如果使用DM有问题,那应该如何在DLL中创建idtcpclient控件呢?我是菜鸟水平,各位大虾能否提供一些具体的实现语句呢?谢谢
      

  4.   

    看看这个可能有用
    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;