访问Delphi应用程序中DLL中加载的TClientDataset的内容

时间:2014-05-13 07:01:07

标签: delphi dll tclientdataset

我有一些DLL,它具有在TClientDataSet上执行的功能,例如要加载的set文件以及加载和保存文件。

unit dll_dmunit;

interface

uses
  System.SysUtils, System.Classes, Data.DB, Datasnap.DBClient, Vcl.Dialogs,Vcl.DBGrids;

type
  TStudentModule = class(TDataModule)
    StudentSet: TClientDataSet;
    StudentSource: TDataSource;
    StudentSetNAME: TStringField;
    StudentSetID: TIntegerField;
    StudentSetAGE: TIntegerField;
    StudentSetSLNo: TAutoIncField;
    dlgOpen: TOpenDialog;
    dlgSave: TSaveDialog;
    private
    { Private declarations }
  public
  end;

  function loadfile:tdbgrid;stdcall;
  procedure setfile(fname:string);stdcall;
  procedure savefile;stdcall;

var
  StudentModule: TStudentModule;
  filename:string;
  grid:TDBgrid;

const
  path:string='C:\Users\GlobalLogic\Documents\RAD Studio\Projects\Student\test.cds';

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

  procedure setfile(f_name: string);stdcall;
  begin
    filename:=f_name;
  end;

  function loadfile:tdbgrid;stdcall;
  var
    _xmldata:string;
  begin
    StudentModule := TStudentModule.Create(nil);
    grid:=TDBGrid.Create(nil);
    result:=grid;
  try
    filename:='C:\Users\GlobalLogic\Documents\RAD Studio\Projects\Student\test.cds';
    StudentModule.StudentSet.LoadFromFile(filename);
    grid.DataSource:=StudentModule.StudentSource;
    _xmldata :=StudentModule.StudentSet.XMLData;
    result:=grid;
  finally
    StudentModule.Free;
  end;
    showmessage('End of the function');
  end;

  procedure  savefile;stdcall;
  begin
    StudentModule.StudentSet.SaveToFile(filename);
  end;
end.

我能够执行loadfile方法,但现在我需要将TClientDataSet的内容导出到Delphi应用程序。为此,我试图获取TDbgrid中的内容,然后将此对象返回到应用程序层,但我无法这样做。 然后我尝试读取XML格式,但无法理解如何传递和解码XML格式。我需要将加载的数据集的内容移动到我想要显示数据的应用程序。 请帮我这样做。 谢谢

1 个答案:

答案 0 :(得分:1)

下面是一个简单的实现,它可以做你想要的,而不必从你的dll导出对象,这往往有点尴尬。相反,只需导出包含数据的XML字符串即可。

重要的一点是导出函数的签名(在本例中为function ExportXML:pwideChar;)和export的{​​{1}}部分。 确保将您的XML数据导出为dll

pwidechar

在您的应用程序中,只需将DLL调用var Xmldata:widestring; ... function loadfile... ... Xmldata :=StudentModule.StudentSet.XMLData; function ExportXML:pwideChar;stdcall; begin result:= pwideChar( Xmldata); end; exports ExportXML name 'ExportXML'; 的结果加载到ExportXML实例中,然后将其插入控件即可。

有关使用dll TClientDataSet部分的更多方法,请参阅Using Export Clause in Libraries,这似乎是您所缺少的内容。

顺便说一句,如果你从Delphi转到Delphi,你不需要exports指令。参见:

  

If you want your library to be available to applications written in other languages,   在导出的声明中指定stdcall是最安全的   功能。其他语言可能不支持Delphi的默认寄存器   召集会议。