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

访问Delphi应用程序中DLL中加载的TClientDataset的内容,delphi,dll,tclientdataset,Delphi,Dll,Tclientdataset,我有一个DLL,它有一些函数要在TClientDataSet上执行,比如设置要加载的文件以及文件的加载和保存 unit dll_dmunit; interface uses System.SysUtils, System.Classes, Data.DB, Datasnap.DBClient, Vcl.Dialogs,Vcl.DBGrids; type TStudentModule = class(TDataModule) StudentSet: TClientDataSe

我有一个DLL,它有一些函数要在TClientDataSet上执行,比如设置要加载的文件以及文件的加载和保存

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格式。我需要将加载的数据集的内容移动到我希望显示数据的应用程序中。 请帮助我这样做。
谢谢你

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

重点是导出函数的签名(在本例中为
函数ExportXML:pwideChar;
)和
dll的
导出
部分确保将XML数据导出为
pwidechar

var Xmldata:widestring;
...
 function loadfile...
...
 Xmldata :=StudentModule.StudentSet.XMLData;

 function ExportXML:pwideChar;stdcall;
 begin
    result:= pwideChar( Xmldata);
 end;

exports
  ExportXML name 'ExportXML';
在应用程序中,只需将DLL调用的结果
ExportXML
加载到
TClientDataSet
实例中,并将其插入控件中即可

有关使用dll的
导出
部分的更多方法,请参阅,这似乎是您缺少的部分

另外,如果要从Delphi转到Delphi,则不需要
stdcall
指令。见:

,, 在导出的声明中指定stdcall是最安全的 功能。其他语言可能不支持Delphi的默认寄存器 电话会议


不能跨DLL边界传递Delphi对象。通过跨DLL边界使用字符串,您已经搞错了。您似乎在寻找的是运行时包。如果您放弃使用单独的模块,将所有代码编译成可执行文件,那么您的生活会轻松得多。@DavidHeffernan-我不熟悉这种语言,所以我无法理解您的回答。您能帮我提供一些代码或链接,让我更好地理解您所说的概念吗?我真的不想在我了解您的目标和要求之前,我将深入了解更多细节。解决此问题的方法有很多种,其中没有一种涉及跨DLL边界传递对象。为什么决定使用DLL?是否要在多个不同的可执行文件之间共享代码?为什么不将所有代码编译成一个可执行文件?@Akash_Kumar:FWIW您可以将整个TClientDataSet的数据(我指的是它的数据属性,而不仅仅是它的“数据”)作为OleVariant跨DLL边界传递,并将其分配给边界另一侧的另一个TClientDataSet。不过,你的导师可能会认为这是作弊;)与使用全局变量相比,更容易返回
WideString
。因为,这最好作为一个out参数。我将这样声明函数:
procedure-ExportXML(const-Intput:WideString;out-Output:WideString);stdcall@DavidHeffernan-同意。我不想卷入这一切。我只是在那里抛出了一些或多或少与问题中使用的代码相吻合的东西,以给出核心答案。重构等等——这是另一回事。