现在的位置: 首页 > 综合 > 正文

难道这又是个未解之谜?— 关于DLL中使用ADODATASET出错的问题

2012年04月21日 ⁄ 综合 ⁄ 共 2211字 ⁄ 字号 评论关闭
难道这又是个未解之谜?--- 关于DLL中使用ADODATASET出错的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128102336156.html
搜索了之前的贴子,未找到有用的信息.  
   
  MD,搞了一天,头都大了,仍然找不到原因:  
  我在DLL中声明了全局ado:TADODataSet;  
  DLL装载时也有  
      CoInitialize(nil);  
      ado:=TADODataSet.Create(nil);  
  但是在读取记录时,  
        ado.CommandText:='select   text   from   Menus   where   id='+inttostr(MenuID);  
        ado.Open;  
        n:=ado.recordcount;    
      或   ado.recno:=1;    
   
  主程序调用此DLL时,走到最后两条这里有时就报内存地址错误,   但有时又没有.   有错误时,严重时会令主程序退出!!!  
  改用DataMoudle,问题依旧!!!  
  百思不得其解,到底为什么???

可以要用   ShareMem,   放在用到   dll   和   dll   的第一   use   顺序处

同意楼上,另外,如果不是多线程,没有必要加CoInitialize(nil);这句,也容易造成地址错误。

帮顶

早就过ShareMem.  
  没用.  
   
  不用CoInitialize(nil)这句,编译都通不过.

没有那么多的迷呀   LZ   F1帮助   可解决LZ一切问题~~    
   
 

而且这个异常出现的很奇怪,   有时甚至打开QQ对话框,   也会导致它出错!  
  或打开其它一个软件或文件,   也导致其出那个错误,   而且错误都发声在访问ADO对象时!!!!  
  难解之谜啊

LZ这么写   把   ado:=TADODataSet.Create(nil);创建的时候写到异常里面去捕捉  
   
  ado:=TADODataSet.Create(nil);  
  try  
      执行ado要读取数据的代码  
  finally  
      ado.free;  
  and;  
 

晕...拜托你看看题目再答吧,兄弟!!  
  创建对象时根本无任何问题,何况有时也能正常工作?

可能是dll中的ado连接的ADOConnection的问题,如果ADOConnection是放在数据模块中,而数据模块也是放在dll中,则这样使用肯定出错,如果是这种情况,你必须在装载dll时显式创建数据模块。

给你作了一个完整的DEMO,连续测试了1000次,OK。  
   
  uses  
      SysUtils,  
      Activex,  
      ADODB,  
      Classes;  
   
  {$R   *.res}  
   
  function   DataExport:   integer;  
  var  
      ADOConnection:   TADOConnection;  
      ADODataSet   :   TADODataSet;  
  begin  
      CoInitialize(nil);  
      ADOConnection   :=   TADOConnection.Create(nil);  
      ADOConnection.ConnectionString   :=   'Provider=SQLOLEDB.1;Persist   Security   Info=False;User   ID=sa;Initial   Catalog=WANGS;Data   Source=.';  
      ADOConnection.LoginPrompt   :=   False;  
      ADODataSet:=   TADODataSet.Create(nil);  
      ADODataSet.Connection   :=   ADOConnection;  
      try  
          ADODataSet.Close;  
          ADODataSet.CommandText:=   'Select   *   From   TWangs_UserInfo   ';  
          ADODataSet.Open;  
          Result   :=   ADODataSet.RecordCount;  
      finally  
          ADODataSet.Free;  
          ADOConnection.Free;  
          CoUnInitialize;  
      end;  
  end;  
   
  exports  
      DataExport;  
   
  begin  
  end.

老冯:  
  1.一定得用   ADODataSet.Connection吗?   这是不是那问题的症结所在?  
  2.可以将其它的ADO对象换成全局的吗?

1.一定得用   ADODataSet.Connection吗?   这是不是那问题的症结所在?   (没有测试过)  
   
  2.可以将其它的ADO对象换成全局的吗?   可以(测试过)

1.一定得用   ADODataSet.Connection吗?   这是不是那问题的症结所在?   可以   (刚刚测试过)  
   
  问题症结应该在  
   
  CoUnInitialize;

不过我建议就按我上面的规格办。我所有的系统涉及这些元件我都是这样办的。久经沙场的。呵呵呵呵

CoUnInitialize;  
  我试过N次了,   加不加这个东西,都一样会有时报错

抱歉!评论已关闭.