function OpenSQL(Str :String):TDataSet;stdcall;
var
 ADOset :TADOQUery;
begin
  ADOset :=TADOQuery.Create(Nil);
  ADOset.Connection :=DM.ADOConn;
  with ADOset do
  begin
    Close;
    SQL.Clear;
    SQL.Add(Str);
    Open;
  end;
  ADOset.Active :=True;
  Result :=ADOset;
end;这个是在DLL中写的一个函数,我Exe文件中调试是通过的,但是编译成了DLL后就是报错,实在是不知道错那里了?各位帮我看看吧谢谢了。。

解决方案 »

  1.   

    把ShareMem单元,放在Uses 的第一个位置,
    Dll和Exe都一样!
      

  2.   

    我加了,一样不行
    而且我用的Pchar
    我觉得没有问题。。就是报错啊。谢谢了
      

  3.   

    报什么错?
        Open;
      end;
      ADOset.Active :=True;  //上面已经OPEN了,这句就不用了!
      

  4.   

    试试在DLL里和调用DLL的程序里都
    use ADODB;
      

  5.   

    你DM是怎么定义的(DLL中)?我试了引用DM单元,那样会出错;
    我改写了一下你的OpenSQL函数;下面是完整的DLL定义:
    library DBTest;uses
      SysUtils,
      Classes,
      DB,
      ADODB;{$R *.res}function OpenSQL(Str :String; Con: TADOConnection):TDataSet;stdcall;
    var
     ADOset :TADOQuery;
    begin
      ADOset :=TADOQuery.Create(Nil);
      ADOset.Connection := Con;
      with ADOset do
      begin
        Close;
        SQL.Clear;
        SQL.Add(Str);
        Open;
      end;
      Result :=ADOset;
    end;exports
      OpenSQL;
    begin
    end.
    下面是测试单元:
    function OpenSQL(Str :String; Con: TADOConnection):TDataSet; stdcall; external 'DBTest.dll';DataSource1.DataSet := OpenSQL('Select * from sql_test_table_1', DM.ADOCon);
    这样就可以了!
    估计你那样调用可能是DM单元没有初始化之类的原因导致错误!
      

  6.   

    大哥们帮帮我啊。。
    还是不行啊,我也加了Uses就是不行,啊我跟了一下,根本就不运行    Close;
        SQL.Clear;
        SQL.Add(Str);
        Open;这个,直接返回了。。不知是怎么了
      

  7.   

    kjiwu(阿磊) 
    你的DM。ADOCon是动态库里面的?
    还是窗体里面的,我不是很明白,你跟我说说吧,谢谢了昂。。
      

  8.   

    动态库中,我没有引用DM.ADOCon,而是用一个参数代替了!
    function OpenSQL(Str :String; Con: TADOConnection):TDataSet;stdcall
      

  9.   

    还是不明白啊。。
    呵呵。。
    那我再窗体调用的时候怎么办啊?
    Con怎么写?
      

  10.   

    DataSource1.DataSet := OpenSQL('Select * from sql_test_table_1', DM.ADOCon);
    这样呀,把你的TADOConnection传进来;
    你先试试我写的,你就会明白了!不难的!
      

  11.   

    呵呵越来越糊涂了。
    传进去啊。。我就是不希望再窗体中往里传,我希望都是在Dll中执行
    我动态建立可以不?
    ADO也是动态建立
      

  12.   

    这个我没想好怎么弄,我不知道你的DM,TDataModal吗?你怎么创建的?这些情况我不太清楚呀!
      

  13.   

    我想你那个程序出错应该是DM这个单元,你的DM没有初始化!
    给你个正解的DLL单元:先自己好好看看吧!
    library DBTest;uses
      SysUtils,
      Classes,
      DB,
      ADODB,
      uDB in 'uDB.pas' {DM: TDataModule};{$R *.res}function OpenSQL(Str :String):TDataSet;stdcall;
    var
     ADOset :TADOQuery;
     DM: TDM;
    begin
      DM := TDM.Create(nil);
      ADOset :=TADOQuery.Create(Nil);
      ADOset.Connection := DM.ADOCon;
      with ADOset do
      begin
        Close;
        SQL.Clear;
        SQL.Add(Str);
        Open;
      end;
      Result :=ADOset;
    end;exports
      OpenSQL;
    begin
    end.
      

  14.   

    kjiwu(阿磊) 
    谢谢你了昂,我知道错那里了,我动态建立就可以了,我把ADO也是动态建立的就可以了。。
    呵呵,就是你所说的,是我没有初始化,我在调用的时候DM上的ADO就没有执行,所以没有数据
    非常感谢你了昂给分