我用Delphi6写了个DLL,主要想用来访问数据库的,
在这个DLL中含有:taMoudle、Adoconnection、AdoQuery
编译完成之后,我在另外程序中调用时老是出现:“Access Violation at address xxxxxxx”。
而我将与数据库有关的代码去掉时,却可以。也就是说错误源头应该是操作数据库发知的。
但应该怎么解决呢,帮帮我!

解决方案 »

  1.   

    谢谢,那要怎样才能确认数据库控件在调用时都已创建?
    我是新建一个DLL工程,在这工程添加一个DataMoudle,Adoconnection、AdoQuery。
    函数也是写在DataMoudle(unit1)中
      

  2.   

    可以增加一个初始化过程,如initProc
    var
      dm : TDataModuleprocedure initproc (); stdcall;
    begin
      dm := TDataModule.Create;
      ...
    end;最后不程序结束时要dm.Free
      

  3.   

    呵呵
    楼主和我一样一样
    用DLL来操作数据库
    但是我觉得这是不明智的
    很容易出问题
    并且数据库和程序紧密相关
    独立性并没表现出来
      

  4.   

    但是当时我还是做了
    虽然也出了很多类似的问题:
    主要是:
    1,DLL中数据连接要随时和主程序分开
    2,使用ADOQuery1的时候,要随时使用随时释放,但是释放的时候请小心,不然容易出错的如果楼主不介意,可以把代码帖出来大家看看
      

  5.   

    我这个Dll是很简单的,主要登录验证,查询用户表而已,只有几行代码,我是想做成Dll后给C#调用。==========================================
    可以增加一个初始化过程,如initProc
    var
      dm : TDataModuleprocedure initproc (); stdcall;
    begin
      dm := TDataModule.Create;
      ...
    end;
    ====================================
    这样能行吗,好像复杂了很多,谁有更好的办法吗?
      

  6.   

    访问连接独立出来是有好处的,
    这样二次开发时就不用管数据连接了,
    你能不能把你的 initproc写具体点
      

  7.   

    initproc怎样写到是无所谓,关键在于在initproc中创建完成数据库操作所需的所有组件,如DataModule,然后才可以访问数据库。
    注意,在程序结束之前必须得释放创建的组件。
      

  8.   

    如果楼主认为这样做烦的话可以在操作代码中如下修改:
    if not Assigned (dm.adoconnection) then                //也就是在使用组件之前可以先判断一下
      dm.adoconnection := TAdoConnection.Create (nil);     //
    dm.adoconnection.open;
      

  9.   

    我还是不明白,
    DataModule已经是建好了(这个DLL中含有:dataMoudle、Adoconnection、AdoQuery)还需要再建DM吗?
    谢谢!
      

  10.   

    搞定了,在调用时加上:
    use Comobj;
    CoInitializeEx(nil,0);
    就好了。
      

  11.   

    dd:tdatamodule;
    dd.create(nil);