我的dll中有下面的代码
Function AddLog(datatemp:Tdatabase;Model:Tquery;userCode, opt: string;optDate,ExitDate:TDateTime):Boolean;
begin
  with Model do
  begin
    Model.Close;
    Model.SQL.Clear;
    Model.SQL.Add('insert into f_code_log (userCode,opt,optDate,ExitDate) values( ');
    Model.SQL.Add(' :userCode,');
    Model.SQL.Add(' :opt,');
    Model.SQL.Add(' :optDate,');
    Model.SQL.Add(' :ExitDate)');
    Model.ParamByName('userCode').Value:=userCode;
    Model.ParamByName('opt').Value:=opt;
    Model.ParamByName('optDate').Value:=optDate;
    Model.ParamByName('ExitDate').Value:=ExitDate;
    Model.ExecSQL;
  end;
  Result:=True;
end;不管把dll中的AddLog  改为procedure还是Function,在exe中经常会出现内存不足;但是如果我把这个AddLog放在program 中就不会有问题.请问怎么办?怎么才能彻底释放dll内存和exe内存?
多谢,如果分数不够,还可以再加!

解决方案 »

  1.   

    很奇怪,是中文报错"内存不足"?
    在Model.ExecSQL;之后加句Model.close;试试
      

  2.   

    我的dll中有下面的代码
    Function AddLog(datatemp:Tdatabase;Model:Tquery;userCode, opt: string;optDate,ExitDate:TDateTime):Boolean;
    begin
      with Model do
      begin
        Model.Close;
        Model.SQL.Clear;
        Model.SQL.Add('insert into f_code_log (userCode,opt,optDate,ExitDate) values( ');
        Model.SQL.Add(' :userCode,');
        Model.SQL.Add(' :opt,');
        Model.SQL.Add(' :optDate,');
        Model.SQL.Add(' :ExitDate)');
        Model.ParamByName('userCode').Value:=userCode;
        Model.ParamByName('opt').Value:=opt;
        Model.ParamByName('optDate').Value:=optDate;
        Model.ParamByName('ExitDate').Value:=ExitDate;
        Model.ExecSQL;
      end;
      Result:=True;
    end;不管把dll中的AddLog  改为procedure还是Function,在exe中经常会出现内存不足;但是如果我把这个AddLog放在program 中就不会有问题.请问怎么办?怎么才能彻底释放dll内存和exe内存?
    多谢,如果分数不够,还可以再加!
      

  3.   

    在delphi6 + MS SQL 2000 测试,没有发现问题啊
    EXE:
    ---------------------------------------------------
      function AddLog(datatemp:Tdatabase; Model:Tquery;
          userCode, opt: string; optDate,ExitDate:TDateTime):Boolean; external 'Project1.dll' name 'AddLog';procedure TForm1.Button1Click(Sender: TObject);
    begin
      with (Self.Query1.Params.Add as TParam) do
      begin
        Name := 'userCode';
        DataType := ftString;
        Precision := 50;
      end;
      with (Self.Query1.Params.Add as TParam) do
      begin
        Name := 'opt';
        DataType := ftString;
        Precision := 50;
      end;
      with (Self.Query1.Params.Add as TParam) do
      begin
        Name := 'optDate';
        DataType := ftDate;
      end;
      with (Self.Query1.Params.Add as TParam) do
      begin
        Name := 'ExitDate';
        DataType := ftDate;
      end;  AddLog(Self.Database1, Self.Query1, 'rr', 'tt', Now(), Now());
    end;配置一个ODBC DSN(名称为test),
    Database1中配置一个Database(名称为tt,设置其ODBC DSN=test以及用户名,密码等),connected 为True
    Query1,设置Databasename为tt
    DLL:
    ---------------------------------------------------------
    library Project1;
    uses
      ShareMem,
      SysUtils,
      Classes,
      DBTables;function AddLog(datatemp:Tdatabase; Model:Tquery;
          userCode, opt: string; optDate,ExitDate:TDateTime):Boolean;// stdcall;
    begin
      with Model do
      begin
        Model.Close;
        Model.SQL.Clear;
        Model.SQL.Add('insert into f_code_log (userCode,opt,optDate,ExitDate) values( ');
        Model.SQL.Add(' :userCode,');
        Model.SQL.Add(' :opt,');
        Model.SQL.Add(' :optDate,');
        Model.SQL.Add(' :ExitDate)');
        Model.ParamByName('userCode').Value:=userCode;
        Model.ParamByName('opt').Value:=opt;
        Model.ParamByName('optDate').Value:=optDate;
        Model.ParamByName('ExitDate').Value:=ExitDate;
        Model.ExecSQL;
      end;
      Result:=True;
    end;exports
      AddLog name 'AddLog';begin
    end.
      

  4.   

    公司使用D6,回家后偶才用D7试试根据偶的习惯,提2建议, 呵呵:
     1.建议用ADO,数据库MSSQL?;如果是Oracle,推荐用ODAC;BDE老麻烦的
     2.尽量不要模块之间传递VCL组件,因为这样的话,就需要在library中引用ShareMem单元,使用Borland的内存管理机制(这个偶没仔细研究过...)。比如这个你可以在你library中动态创建TADOQurey(如果是ADO的话...),外部传入ConnectionString和 SQL string, 当然这样用的是短连接,用完通常就会把这个ADOQuery Free掉了
      

  5.   

    同意lostmyway,
    用dll传对象和string就一定要sharemem。只有这样2边才会共用一个内存管理器。