我在DLL中使用了数据库,程序调用它,有时开始时会弹出
"Access violation at address 00000000. Read of address 00000000."
可气的就是有时有,有时没有,出现的机率在20%左右!!!!
我想尽了办法,还是找不到错误出在何处!!!!
求高人指点迷津,实感激不尽!!!!!附上DLL中的主要部分:
DLL的BEGIN,END间:
try
  CoInitialize(nil);
  ADOConnection := TADOConnection.Create(nil);
  ADOConnection.LoginPrompt:=false;
  ado:=TADODataSet.Create(nil);
  ado1:=TADODataSet.Create(nil);
  ado.Connection :=ADOConnection;
  ado1.Connection:=ADOConnection;
except
end;
初始化函数:
//Receive init params
function InitVars(t:INITPARM):boolean;stdcall;
begin
  try
  //Get data inputed by user
  pInit:=t;
  //Init database connecting string
  ADOConnection.Close;
  ADOConnection.ConnectionString :=pInit.IniMDBConStr;
  ADOConnection.Open();
  //FillChar(vParm,sizeof(vParm),0);
  except
  end;
end;
DLL退出时
procedure opr(d:dword);
begin
 if d=0 then begin
   try
   //ado.Free; 
   //ado1.Free;
   //ADOConnection.Free;
   CoUninitialize;
   except
   end;
 end;
end;

解决方案 »

  1.   

    呵呵,你为什么要把它写在DLL里呢?你的项目要求到底是怎么样的??
      

  2.   

    基于目前的框架,所有的数据库访问几乎都是在DLL中的,没办法啊!!!!
    我相信一定有解决方法的,期待...
      

  3.   

    TADOConnection.Create(nil);

    CreateOleObject("ADODB.Connection")
    替换试试
      

  4.   

    直接用ADODC的_Recordset之类的
    不要用VCL封装的,那就一定OK
      

  5.   

    在动态链接库中好像不能使用这样的程序功能,可以是逻辑功能吧?用COM组建肯定行的通。
      

  6.   

    建议先用exe测试稳定,然后再移植到dll中,99%是你的代码有问题
    须要一步一步测试,要有耐心的.
      

  7.   

    读空指针吧  代码太弱了  没有一个地方有Assigned
      

  8.   

    呵呵 ~
    偶DLL用的是从EXE中传进去的对象!
      

  9.   

    在DLL上加参数传递调用程序窗体句柄procedure getconn(hwnd:dword);
    begin
    CoInitialize(nil);
    application.handle:=hwnd;
    adoconn:=tadoconnection.create(application);end;EXE传递
    getconn(handle);
      

  10.   

    你先把try except都去掉再说...
      

  11.   

    你这样编写,不出问题才怪。建议把各种控件放到一个DataModule上面,然后创建DataModule。而且尽量不要动态创建、释放这种与COM相关的对象。应该创建出来后,一用到底
      

  12.   

    我自己写的DLL可以操作数据库,我发个给你试下
      

  13.   

    本人觉得你对DLL还不够了解。说这个话你别生气哦
      

  14.   

    在DLL传递什么什么,最好用内存映射,不然。。
      

  15.   

    CoInitialize(nil);好像这不应放在DLL里
      

  16.   

    我说了,总觉得以前不这么用的‘CoInitialize(nil)“今天看到一帖!!记起来了:“原因是没有Application.initialize,即没有对COM对象初始化。如果在Delphi的Dll里面使用了ADO组件,那么需要在使用之前调用ActiveX的CoInitialize方法。
    例如:CoInitialize();
          query := TADOQuery.Create(nil);”
    申明:这不是我说的,转帖!
      

  17.   

    不用DLL转用CLASS了,状态很稳定目前.
    先把分结了,如果能有效解决此问题的,另开贴给分.