百分求例子。我程序中使用如下类
type
  TMan=class
  Name:Pchar;
  Sex:Pchar;
  Age:Integer;
end;我想在App.exe中创建这个类TMan的一个对象 AMan,并令AMan.Name='张三',然后把AMan送入到 dll.dll 进行填充(Fill),完成之后再把结果返回主程序App.exe。主程序Show出AMan.Sex代码段
App.exeprocedure button1click();
var
   AMan:TMan;
begin
   AMan:=TMan.create;
   AMan.Name:='张三';
   Fill(AMan);
   Showmessage(AMan.sex);
   AMan.free;
end;在Dll中
function TMan.fill(AMan:TMan):Boolean;
begin
    AMan.sex='男';
    AMan.age=18;
    Result:=true;
end;
上面的书写方法不太严谨,但不影响理解。但这种方法,DLL中不能传出类的对象。看了资料,说要应用接口技术,但是,书上都是讲接口是什么东西呀,接口怎么定义呀,然后怎么Query、怎么Addref呀,就没讲定义了接口后怎么实现,晕中,
所以求助各位达人,给写个简单的示例。因为我想把部分功能封在DLL里。
我真实要传的对象有20多个属性,我不想一个个作为参数传进传出DLL。所以,APP传给DLL的要是一个对象,返回也是一个对象。或是用Var AMan传递。又AMan传进DLL后要进行Fill,这个功能在DLL中实现,就这样了,
谁帮帮我!代码打包给 [email protected]

解决方案 »

  1.   

    看刘艺的Delphi面向对象编程思想。
    可以用接口或抽象类。利用一个公共的单元。。
      

  2.   

    Up.刘艺的书这边没得卖。谁写个Demo给我先,加分的说!
      

  3.   

    以前做的一小例子,看其思想即可:
    ------------
    数据模块单元:
    unit DBmdUnit;interfaceuses
      SysUtils, Classes, DB, ADODB, Provider;type
      TDataModule1 = class(TDataModule)
        ADOConnection1: TADOConnection;
        bInfoQuery: TADOQuery;
        ReaderQuery: TADOQuery;
        DSPbookInfo: TDataSetProvider;
        DSPreader: TDataSetProvider;
      private
        { Private declarations }
      public
        { Public declarations }
      end;implementation{$R *.dfm}end.
      

  4.   

    --------------------
    抽象类共同单元:
    unit SClass;interfaceuses
       Classes,DB,ADODB;type
    //该记录保存重要的全局信息--------------
      TImvalue=record
         lendNum:integer; //可借书数量(以本计)
         lendTime:integer;//借书的时间长度(以月计)
         CartTime:integer; //借书证有效期(以月计)
      end;//一个数据库操作的抽象类
      TISearch=class(TObject)
      public
        constructor create;virtual;abstract;
        procedure GetImportValue(var ImValue:TImvalue);virtual;abstract;
        function GetBookInfo(SType,SRange,SCon,ReNum:string):OleVariant;virtual;abstract;
        function GetReaderLend(RNum,ReNum:string):OleVariant;virtual;abstract;
      end;//上面的类的引用
       TISearchClass=class of TISearch;implementationend.
    ------------------
    DLL的单元:
    unit SSubClass;interfaceuses
      DBmdUnit,SClass,SysUtils,Classes, DB, ADODB,Variants;type
    //继承一个子类,以实现里面的操作
      TSearch=class(TISearch)
      private
        DataModule1: TDataModule1;
      public
        constructor create;override;
        destructor Destroy;override;
        procedure GetImportValue(var ImValue:TImvalue);override;
        function GetBookInfo(SType,SRange,SCon,ReNum:string):OleVariant;override;
        function GetReaderLend(RNum,ReNum:string):OleVariant;override;
      end;implementationconstructor TSearch.create;
    begin
      DataModule1:=TDataModule1.Create(nil);
    end;destructor TSearch.Destroy;
    begin
      DataModule1.Free;
      inherited Destroy;
    end;
    //------------------------------------------
    //取得info表的数据
    procedure TSearch.GetImportValue(var ImValue:TImvalue);
    begin
      with DataModule1 do
      begin
       ReaderQuery.Close;
       ReaderQuery.SQL.Clear;
       ReaderQuery.SQL.Add('select * from Info');
       ReaderQuery.Open;
       ReaderQuery.First;
       ImValue.lendNum:=ReaderQuery.fieldByName('可借数').AsInteger;
       ImValue.CartTime:=ReaderQuery.fieldByName('图书证有效期').AsInteger;
       ImValue.lendTime:=ReaderQuery.fieldByName('借书有效期').AsInteger;
       ReaderQuery.Close;
       ReaderQuery.SQL.Clear;
       ReaderQuery.SQL.Add('select * from Reader');
       ReaderQuery.Open;
      end;
    end;
    //取得图书信息表的数据
    function TSearch.GetBookInfo(SType,SRange,SCon,ReNum:string):OleVariant;
    begin
      with DataModule1 do
        try
        if  not ADOConnection1.Connected then
          ADOConnection1.Connected:=true;
        bInfoQuery.Close;
        bInfoQuery.SQL.Clear;
        bInfoQuery.SQL.Add('Select top '+Renum+' * from bookInfo ');
        bInfoQuery.SQL.Add('where '+SType+' like ''%'+SCon+'%'' ');
        bInfoQuery.SQL.Add('and 所在室='''+SRange+'''');
        bInfoQuery.Open;
        Result:=DSPbookInfo.Data;
        finally
         ADOCOnnection1.Connected:=false;
        end;
    end;
    //取得读者表的数据
    function TSearch. GetReaderLend(RNum,ReNum:string):OleVariant;
    begin
      with DataModule1 do
        try
        if not ADOConnection1.Connected then
        ADOConnection1.Connected:=true;
        bInfoQuery.Close;
        ReaderQuery.SQL.Clear;
        ReaderQuery.SQL.Add('Select top '+ReNum+' * from Reader');
        ReaderQuery.SQL.add('where 读者号 like '''+RNum+'''');
        ReaderQuery.Open;
        Result:=DSPReader.Data;
        finally
         ADOCOnnection1.Connected:=false;
        end;
    end;end.
      

  5.   

    ----------------
    DLL工程文件:
    library SearchDll;
    uses
      SysUtils,
      Classes,
      SClass in 'SClass.pas',
      DBmdUnit in 'DBmdUnit.pas' {DataModule1: TDataModule},
      SSubClass in 'SSubClass.pas';{$R *.res}
    Function SearchClass:TISearchClass;
    begin
      result:=TSearch;
    end;
    exports
      SearchClass;
    begin
    end.
    --------------------------
    界面单元
    unit SearchUnit;interfaceuses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, ExtCtrls, Grids, DBGrids, DB,
      DBClient,SClass,SSubClass;
    type
      TForm1 = class(TForm)
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        Panel1: TPanel;
        Panel2: TPanel;
        CBStlye: TComboBox;
        GroupBox1: TGroupBox;
        GroupBox2: TGroupBox;
        Label1: TLabel;
        Label2: TLabel;
        CBRange: TComboBox;
        Label3: TLabel;
        Bevel1: TBevel;
        Bevel2: TBevel;
        EditSearch: TEdit;
        Label4: TLabel;
        Bevel3: TBevel;
        EditNum: TEdit;
        UpDown1: TUpDown;
        Button1: TButton;
        ClientDataSet1: TClientDataSet;
        Label5: TLabel;
        EditReader: TEdit;
        EditRe: TEdit;
        Label6: TLabel;
        UpDown2: TUpDown;
        Button2: TButton;
        EditName: TEdit;
        Label7: TLabel;
        EditTime: TEdit;
        Label8: TLabel;
        EditEnd: TEdit;
        Label9: TLabel;
        EditKill: TEdit;
        Label10: TLabel;
        EditBNum: TEdit;
        Label11: TLabel;
        Bevel4: TBevel;
        StaticText1: TStaticText;
        ListView1: TListView;
        ClientDataSet2: TClientDataSet;
        ListView2: TListView;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
        procedure EditReaderKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure EditSearchKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
        SBookInfo:TISearch;
        ImValue:TImvalue;
      public
        { Public declarations }
        procedure GetReader;
        procedure GetBookInfo;
      end;
    function SearchClass:TISearchClass;external 'SearchDll.dll';
    var
      Form1: TForm1;implementation{$R *.dfm}
    //--------------------------------------
    //程序创建时,创建DLL中的查询类,并取得重要的数据
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      SBookInfo:=SearchClass.create;
      SBookInfo.GetImportValue(ImValue);
    end;
    //------------------------------------------
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       SBookInfo.Free;
    end;
    //---------------------------------------------
    //模糊查询图书信息
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetBookInfo;
    end;procedure TForm1.EditSearchKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if Key=VK_ReTurn then
              GetBookInfo;
    end;
    //-------------------------------------------
    //精确查询读者信息
    procedure TForm1.Button2Click(Sender: TObject);
    begin
        GetReader;
    end;procedure TForm1.EditReaderKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
       if Key=VK_ReTurn then
          GetReader;
    end;
    //-------------------------------------
    //函数功能模块
    //取得读者借阅信息
    procedure TForm1.GetReader;
    begin
      if editreader.Text='' then
        begin
         showmessage('请输入要查询的内容');
         exit;
        end
       else begin
         ClientDataSet2.Active:=False;
         ClientDataSet2.Data:=SBookInfo.GetReaderLend(EditReader.Text,Editre.Text);
         ClientDataSet2.Active:=True;
       end;
       ListView1.Items.Clear;
       with ClientdataSet2 do
       begin
         First;
         Editname.Text:=FieldByName('姓名').AsString;
         EditTime.Text:=FieldByName('办证时间').AsString;
         EditKill.Text:=FieldByName('冻结').AsString;
         EditBNum.Text:=FieldByName('借书数').AsString;
         //显示读者证的截止时间
         EditEnd.Text:=DateTimeToStr(incMonth(FieldByName('办证时间').AsDateTime,Imvalue.CartTime));
         While not Eof do
         begin
            with ListView1.Items.Add do
            begin
                caption:=fieldByName('书号').AsString;
                SubItems.Add(fieldByName('书名').AsString);
                SubItems.Add(fieldByName('借书时间').AsString);
                SubItems.Add(DateTimeToStr(incMonth(FieldByName('借书时间').AsDateTime,Imvalue.lendTime)));
            end;
            next;
         end;
       end;
    end;
    //取得图书信息
    procedure TForm1.GetBookInfo;
    begin
      if editSearch.Text='' then
       begin
         showmessage('请输入要查询的内容');
         exit;
       end
       else begin
         ClientDataSet1.Active:=False;
         ClientDataSet1.Data:=SBookInfo.GetBookInfo(CBStlye.Text,
         CBRange.Text,EditSearch.Text,EditNum.Text);
         ClientDataSet1.Active:=True;
       end;
       ListView2.Items.Clear;
       with ClientdataSet1 do
       begin
         While not Eof do
         begin
            with ListView2.Items.Add do
            begin
                caption:=fieldByName('书号').AsString;
                SubItems.Add(fieldByName('书名').AsString);
                SubItems.Add(fieldByName('作者').AsString);
                SubItems.Add(fieldByName('出版社').AsString);
                SubItems.Add(fieldByName('类型').AsString);
                SubItems.Add(fieldByName('借还').AsString);
                SubItems.Add(fieldByName('所在室').AsString);
                SubItems.Add(fieldByName('所在区').AsString);
                SubItems.Add(fieldByName('位置').AsString);
            end;
            next;
         end;
       end;
    end;
    //-----------------------------------------end.