问题描述:    我的程序大致分为两块,一块是应用程序,一块是为之服务的Dll。 
    其中,Dll主要进行数据库的操作(为了将界面显示和数据逻辑操作分开),因此,Dll中引用了存在于应用程序中的一个DataModule(亦即一个DataModule,被应用程序和Dll共用,Add进去的),而DataModule中放置了ADOConnection控件、ADOQuery控件和DataSetProvider控件。
    为了便于操作数据库,我在Dll中分别写了一个执行'Select'与另一个执行其它'update'、‘delete’...的函数与过程,。这样之后,那个执行'Select'的函数就开始捣乱了。我在应用程序中无论是静态调用它,还是动态调用它,程序在执行几轮之后(执行相同的操作几次,比如说按钮事件我多点击几次),就崩溃了,报出的错误是大家经常看到的内存错误
    以下附代码:
{以下是执行select语句的操作,问题就出现在它身上}
class function TDataBaseOper.ExeSel(asql: WideString): OleVariant;    //此处返回值如果为TDataSet的话会有更
//奇怪的问题,因此在此处返回OleVariant,然后在应用程序中去转换为TDataSet
begin
  try
    With DataModule1.ADOQry do
    begin
      try
        Close;
        SQL.Clear;
        SQL.Add(asql);
        Open;
          Result := DataModule1.DSPrd.Data;
        Close;
      except
        on e: Exception do
        begin
          Application.MessageBox(PChar(‘数据库操作失败’+ #13#10 + e.Message), '错误’, MB_OK + MB_ICONWARNING + MB_TOPMOST);
          Exit;
        end;
      end;
    end;
  finally
    //
  end;
end;   问题补充:在获取小量数据时,程序调用上面的方法能执行的次数比较大,最多我测试到了60次。而如果一次select操作获取的数据量过大时,那么应用程序调用这个位于Dll中的方法能执行的次数锐减至2次。(次数是说明程序在出现内存错误之前能“正常”执行的次数)这两天被这个问题快给逼疯了,本以为自己查阅资料就能解决的,结果没有任何进展,只能向大神们请教了 !

解决方案 »

  1.   

    CTMD,洗洗后来了灵感,应用程序和Dll都Uses了Sharemem单元,问题迎刃而解!
    当初就是为了避免在Dll中使用string类型的参数,因而所有的string我都利用PChar来代替,没想到这万恶的Delphi还是把问题丢给了我!大家说说自己类似的经历吧,准备接分!
      

  2.   

    DLL中我一般用原生ADO自己创建,自己控制,所以没有遇到过楼主的问题。
      

  3.   

    用PCHAR的话就要注意字符串的内存到底是谁控制,有时其实更容易出错。如果不是和其它语言通讯,我一般都用内存共享。
      

  4.   


    O(∩_∩)O~,用DataModule集中进行管理,个人觉得这样更方便!