Procedure TDepartmentList.showtree;
var
  Pnode:TTreeNode;
  ParentName : string;
  TmpQry1 : TAdoQuery;
begin
TmpQry1:=TAdoQuery.Create(nil); //执行到这里出现 Access Violation at address 01645360 in module 'basedata.dll'. Read of address 00000058
TmpQry1.Connection:=DataModel.HQDatabase;

解决方案 »

  1.   

    DLL中是可以动态创建ADOQuery的!!!你在创建之前要对Com进行初始化!!!
    调用以下的函数CoInitialize!!!
      

  2.   

    Procedure TDepartmentList.showtree;
    var
      Pnode:TTreeNode;
      ParentName : string;
      TmpQry1 : TAdoQuery;
    begin
    -->CoInitialize(nil);
    TmpQry1:=TAdoQuery.Create(nil);
    我加了CoInitialize还是出现错误提示
      

  3.   

    已经打开 ActiveX 了.但执行时仍然出现如题的错误.程序可以通过编译.
      

  4.   

    你把Create(nil)改一下,改成 Create(Self)试试看怎么样。
      

  5.   

    可以动态创建啊
    uses adodb
      

  6.   

    还是不行啊!AdoDB,DB,ActiveX 已经uses了编译已经完全通过了,就是执行时出错!
      

  7.   

    TmpQry1.Connection:=DataModel.HQDatabase;
    应该是这行有问题。
      

  8.   

    对就是这一行有问题,我以前遇到过
    TmpQry1.Connection:=DataModel.HQDatabase;
    不相信你可以直截只用
    TmpQry1:=TAdoQuery.Create(nil); 
    Tmpqry1.close;
    tmpqry1.connetionstring:='''''
    ....
    来试试看
    就是不要用
    TmpQry1.Connection:=DataModel.HQDatabase;
    就可以了
      

  9.   

    Delphi_Li(Delphi Li) 和 adamdary(燕七) 说地有道理, 首先在程序里use  ActiveX, 在DLL开始时,一定要在创建ADOQuery前CoInitialize(nil);然后在DLL结束时加上CoUninitialize
      

  10.   

    把Create(nil)改成 Create(Self)。