问题是这样的,比如有一个主窗体去使用一个dll,然后主窗体中有一个ADOConnection,而dll中有一个ADOQuery,我应该怎么样才能让dll中的这个ADOQuery连接上主窗体中的ADOConnection呢?
最好能给出代码的,我本来是想这么实现的:
form1中:var
  Form1: TForm1;
  function creatFo():TForm;external 'Project2.dll';
  function getCon():tadoquery;external 'Project2.dll';
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
form2: TForm;
begin
 form2:=creatFo;
 form2.Show;
 getcon.Connection:=adoconnection1;
end;end.dll中: function creatFo():TForm;
  begin
  result:=tform1.Create(nil);
  end;
  function getCon():tadoquery;stdcall;
  begin
       result:=ADOQuery1;
  end;exports
creatFo,
getCon;
end.

解决方案 »

  1.   

    ADOConnection和ADOQuery都可以放在一个DataModule中,这样抽取出来可以供窗体和Dll调用
      

  2.   

    但是dll和我的主窗体根本就不在同一个Project中,dll又如何访问到DataModule呢
      

  3.   

    你也可以通过调用DLL的函数,把ADOConnection的连接字符串传递给ADOQUERY的呀。
      

  4.   


    //建立的dll文件
    uses
      SysUtils,
      DB,
      ADODB,
      Classes,
      Dialogs,
      Unit2 in 'Unit2.pas';{$R *.res}procedure GetCon(aCon: TADOConnection);  stdcall;
    begin
      MyCon := aCon;
    end;procedure DisplayMessage;   stdcall;   //供窗体来测试
    begin
      ShowMessage(MyCon.ConnectionString);
    end;exports
      GetCon,
      DisplayMessage;begin
    end.//以下内容是dll文件包含的一个pas文件,主要用来声明ADO控件unit Unit2;interfaceuses
      Windows,
      SysUtils,
      DB,
      ADODB,
      ActiveX,
      Classes;
    var
      MyCon: TADOConnection;implementationinitialization
      CoInitialize(nil);finalization
      CoUninitialize;
    end.//然后你在窗体中就可以调用GetCon过程为dll的ADOConnection赋值了//如下:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }  public
        { Public declarations }
      end;var
      Form1: TForm1;
      procedure GetCon(aCon: TADOConnection); stdcall;  external 'Project2.dll' name 'GetCon';
      procedure DisplayMessage;  stdcall;  external 'Project2.dll' name 'DisplayMessage';
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetCon(ADOConnection1);
      DisplayMessage;
    end;end.
      

  5.   

    但是这样会创建太多的连接,我知道adoquery中有connectionstring属性,但是如果这样的话创建adoconnection还有什么意义呢?我就是想主窗体的adoconnection连接到数据库上,然后n多dll窗口中的adoquery都连接到主窗体的adoconnection
      

  6.   

    最简单的方法是传递adoconnection的连接字符串,你是用dll封装mdi子窗体吧,这样封装得解决很多问题,具体开发时你会遇到的。很封装sdi有很多区别的。