在程序中简单的调用dll出现的错误。dll中有对access数据库的查询。
//冲头端面到前死点的距离//
function PunchFDC(A:Real):Real ;
var
 query1:TADOQuery;
 P:string;
begin
  CoInitialize(nil);
  Query1:=TADOQuery.Create(nil);
   try
     begin
      P:=FloatToStr(A);
      Query1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=时序设计dll/MainSliderMove.mdb;Persist Security Info=False';
      Query1.SQL.Clear;
      Query1.SQL.Add('select stroke from 1 where Angle='+P+'');
      Query1.Open;
      Result:=query1.FieldByName('Stroke').Value;
     end;
   finally
     query1.Free;
     CoUninitialize;
   end;
end;

解决方案 »

  1.   

    把CoInitialize与CoUninitialize分别放在initialization和finalization节中试试。
      

  2.   

    Data Source=时序设计dll/MainSliderMove.mdb,这样的写法有问题,因为它用的是相对路径而不是绝对路径。
    如果应用程序在调用DLL时的文件路径与Data Source所在路径不符,就肯定找不到Data Source,这样就肯定会出现access violation 错误!解决办法:有两种:
    1、在Data Source中指明绝对文件路径
    2、先获取目前Exe文件路径,再根据此路径运算出Data Source的路径,而Data Source中用变量来代替
      

  3.   

    我是把dll和调用程序放在同一个文件夹里的
      

  4.   

    把這段代碼不要放在DLL裏,放在正常的窗體下測試下看看,本身應該沒什麼大的問題。Data Source=时序设计dll/MainSliderMove.mdb   這個路徑你要保證是對的。     Query1.SQL.Add('select stroke from 1 where Angle='+P+''); 
          Query1.Open; 
          Result:=query1.FieldByName('Stroke').Value; // 這裏的VALUE 你要保證有值,不是是NULL值
      

  5.   

    數據庫連接問題,Data Source=时序设计dll/MainSliderMove.mdb  這個路徑你要保證是對的。 
      

  6.   

    我将这段查询代码单独做成dll再调用是可以的。而将下面一段查询代码单独做成dll,再调用出现access violation at 0x7c957a50:write of address 0x00030d24错误,问题应该在这段程序里。程序如下:
    //夹钳张开到不发生干涉时间T//
    function TongTime(S1:Real{夹钳径向移动距离}):Real ;
    var
     Query1:TADOQuery;
     An1,An2,St1,St2:Real;
     s,t:Real;
     P,Q:string;
    begin
     CoInitialize(nil);
     Query1:=TADOQuery.Create(nil);
     try
       begin
         P:=FloatToStr(S1) ;
         Query1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=时序设计dll/Tong305Move.mdb;Persist Security Info=False';
         Query1.SQL.Clear;
         Query1.SQL.Add('select Angle,Stroke1,Strok2 from 1 where '+P+' between Stroke1 and Stroke2');
         Query1.Open;
         An1:=Query1.FieldByName('Angle').Value;
         St1:=Query1.FieldByName('Stroke1').Value;
         St2:=Query1.FieldByName('Stroke2').Value;
         Q:=FloatToStr(St2);
         s:=St2-St1;
         Query1.Close;
         Query1.SQL.Clear;
         Query1.SQL.Add('select Angle from 1 where stroke2='+Q+'');
         Query1.Open;
         An2:=Query1.FieldByName('Stroke2').Value;
         t:=An2-An1;
         Result:=t*(S1-St1)/s+An1;
       end;
     finally
       begin
         Query1.Free;
         couninitialize;
       end;  
     end;
    end;
      

  7.   

    问题找到了,调用dll路径错了。汗一个~~ 谢谢各位了!