在程序中简单的调用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;
//冲头端面到前死点的距离//
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;
如果应用程序在调用DLL时的文件路径与Data Source所在路径不符,就肯定找不到Data Source,这样就肯定会出现access violation 错误!解决办法:有两种:
1、在Data Source中指明绝对文件路径
2、先获取目前Exe文件路径,再根据此路径运算出Data Source的路径,而Data Source中用变量来代替
Query1.Open;
Result:=query1.FieldByName('Stroke').Value; // 這裏的VALUE 你要保證有值,不是是NULL值
//夹钳张开到不发生干涉时间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;