这是我的代码:
library temp;uses
  SysUtils, ADODB;{$R *.res}var
  AVConn             : TADOConnection;
  AVDataSet          : TADODataSet;
function nouse: Integer;
begin
  result:= 1;
end;exports
  nouse;begin
  AVConn                    := TADOConnection.Create(nil);
  AVConn.ConnectionString   := 'Provider=SQLOLEDB.1;UID=temp;PWD=temp;database=temp;'
  AVDataSet                 := TADODataSet.Create(nil);
  AVDataSet.Connection      := AVConn;
  AVDataSet.CommandText     := 'select *  from temptable';
  AVConn.Connected          := True;
  AVDataSet.Open;
end;可是总是在AVConn Create的那句报错。而用program改成exe文件就不会出错。这是怎么回事?

解决方案 »

  1.   

    不是Delphi的bug,DLL中的begin end;中的代码在LoadLibrary时就会执行,
    这些代码不能直接放到DLL的begin  end;之中,为什么不把它放到nouse方法中去?或者另外用一个方法来实现,然后在LoadLibrary之后调用该方法初始化?AVConn                    := TADOConnection.Create(nil);
      AVConn.ConnectionString   := 'Provider=SQLOLEDB.1;UID=temp;PWD=temp;database=temp;'
      AVDataSet                 := TADODataSet.Create(nil);
      AVDataSet.Connection      := AVConn;
      AVDataSet.CommandText     := 'select *  from temptable';
      AVConn.Connected          := True;
      AVDataSet.Open;
      

  2.   

    还是不行啊!放到nouse里还是出错!!
      

  3.   

    方法一:在dll中加上ActiveX初始代码及结束代码:初始代码
    CoInitialize(nil);
    结束代码
    CoUnInitialize;方法二:不要直接在dll的begin end部分使用ADO, 
    可以把它封装成一个函数确保在Application.Initialize后执行。建议使用方法二。
      

  4.   

    TADOConnection.Create(nil);
    TADODataSet.Create(nil);
    怎么可以这样写呢?我认为应该这样:
    TADOConnection.Create(self);
    TADODataSet.Create(self);
    我想应该OK了。
      

  5.   

    另外,最好把
    AVConn.Connected          := True;
    换成
    AVConn.Open;
      

  6.   

    to  westfly(西翔):
    你说的两种方法能不能说详细些啊!