我在主程序里有一个数据模块,已经创建并连接到数据库上了, 我在另一个DLL里如何可以直接使用他而不需要TDataModule.Create(Self)再创建它,因为主程序里已经有了连接到数据库了????

解决方案 »

  1.   

    用interface接口吧再做一个类从接口中继承下来,并对实例化.对接口中虚拟方法实现一下!
    interface类放在独立的单元文件中, 这个单元文件加入DLL项目和主程序项目
    并编译!如果不太明白的话, 你可以到www.delphibox.com里下一个这样的例子.
    用点心, 接口其实很简单.
      

  2.   

    将数据模块那个单元,包涵到Dll的工程里面去,然后主程序将对象传到Dll里面去,Dll就可以操作这个对象了,我写了个例子://数据模块
    unit Data;interfaceuses
      SysUtils, Classes, DB, ADODB;type
      TDataModule1 = class(TDataModule)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DataModule1: TDataModule1;implementation{$R *.dfm}end.//主程序
    program TestApp;{$APPTYPE CONSOLE}uses
      //SysUtils,
      ActiveX,
      Data in 'Data.pas' {DataModule1: TDataModule};procedure Foo(DataModule: TDataModule1); external 'TestDll.dll';begin
      CoInitialize(nil);
      DataModule1:=TDataModule1.Create(nil);
      DataModule1.ADOQuery1.Insert;
      DataModule1.ADOQuery1.FieldByName('num').Value:=1;
      DataModule1.ADOQuery1.Post;
      Foo(DataModule1);
      DataModule1.Free;
      CoUninitialize;
      ReadLn;
    end.//动态库
    library TestDll;uses
      //SysUtils,
      //Classes,
      Data in 'Data.pas' {DataModule1: TDataModule};{$R *.res}procedure Foo(DataModule: TDataModule1);
    begin
      DataModule1:=DataModule;
      DataModule1.ADOQuery1.First;
      while not DataModule1.ADOQuery1.Eof do
      begin
        WriteLn(DataModule1.ADOQuery1.FieldByName('num').Value);
        DataModule1.ADOQuery1.Next;
      end;
    end;exports
      Foo;beginend.