大家帮忙看看,我这个DLL文件有什么问题,如能解决可再开贴加分library ConCheck;{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }uses
  ShareMem,
  SysUtils,
  Classes,
  AdoConEd,
  ADODB,
  DB,
  Forms;var
   SorTableName: String;
   ChkTableName: String;
   VehCor: String;
   VehNo: String;
   ADODataCon: TADOConnection;
   ADOQTemp: TADOQuery;{$R *.res}function ConDB(DSStr: String; SorTName: String; ChkTName: String; AVehCor: String; AVehNo: String):Integer;stdcall;          //函数返回0是未连上,返回1是连接上
begin
   //读取数据源连接字符串
   SorTableName := SorTName;
   ChkTableName := ChkTName;
   VehCor := AVehCor;
   VehNo := AVehNo;   if not Assigned(ADODataCon) then
      ADODataCon := TADOConnection.Create(Application);
   if not Assigned(ADOQTemp) then
      ADOQTemp := TADOQuery.Create(Application);   //如果已经处于连接状态,则先关闭,此种情况是用于在程序正常运行的时候,改变数据库连接
   if ADODataCon.Connected then
   begin
      ADODataCon.Close;
      ADODataCon.ConnectionString := DSStr;
   end
   else
     ADODataCon.ConnectionString := DSStr;   try
     ADODataCon.Open;
   except
      On E:Exception do
      begin
         Result := 0;
      end;
   end;
    Result := 1;
end;function FindVeh(VehColor:String; VehPlate:String):Integer;stdcall;
var
  StrSql: String;
begin
   try
     StrSql := 'select * from '+ SorTableName+' where '+VehCor+'='+QuotedStr(VehColor)+' and '+ VehNo+'='+QuotedStr(VehPlate);
     ADOQTemp.Close;
     ADOQTemp.SQL.Clear;
     ADOQTemp.SQL.Add(StrSql);
     ADOQTemp.Prepared := True;
     ADOQTemp.Open;
     if ADOQTemp.RecordCount>0 then
        Result :=1  //找到
     else
        Result := 0;//没找到
   except on E:Exception do
      begin
        Result := 2; //异常
      end;
   end;end;procedure SaveData(Enrollid: Integer; VehColor: String; VehPlate: String; ChkType: String);stdcall;
var
  StrSql: String;
begin
   try
     StrSql := 'Insert into '+ ChkTableName+' (enroll_id, ' +VehCor+','+VehNo+', inspect_id) Values('+ IntToStr(Enrollid)+', '+QuotedStr(VehColor)+', '+QuotedStr(VehPlate)+', '+QuotedStr(ChkType)+')';
     ADOQTemp.Close;
     ADOQTemp.SQL.Clear;
     ADOQTemp.SQL.Add(StrSql);
     ADOQTemp.Prepared := True;
     ADOQTemp.ExecSQL;
   except on E:Exception do
   end;end;exports
   ConDB,
   SaveData,
   FindVeh;beginend.

解决方案 »

  1.   

    调用这个DLL文件时出现错误access violation at address 0060B09C in module 'ConCheck'是什么意思啊,请大家帮忙看看啊
      

  2.   

    我觉得应该是错在
       if not Assigned(ADODataCon) then
          ADODataCon := TADOConnection.Create(Application);
       if not Assigned(ADOQTemp) then
          ADOQTemp := TADOQuery.Create(Application);这四句;1.我觉得TADOConnection.Create这个操作,不必放在这里,
    比如放在初始化节,也就是用每次都判断这个条件  if not Assigned(ADODataCon) then2.dll中,就不要使用Application了,使用hinstance如ADOQTemp := TADOQuery.Create(hinstance);或者干脆使用为空
    ADOQTemp := TADOQuery.Create(nil);
    ADOQTemp := TADOQuery.Create();
      

  3.   

    if not Assigned(ADOQTemp) then
    begin
          ADOQTemp := TADOQuery.Create(Application);
          ADOQTemp.Connection := ADODataCon;
    end;
      

  4.   

    晕,地址错误自己单步进去不就可以了.找找哪出的错.dll选择一个调用它里面函数的exe做宿主就可以设置断点调试进去了.run->parameters->选择一个host application.