gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:58:09 25 4
gpt4 key购买 nike

我有 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 中导出对象,这往往有点笨拙。相反,只需导出包含数据的 XML 字符串即可。

重点是导出函数的签名(在本例中为 function ExportXML:pwideChar; )和 export您的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实例并将其插入您的控件中。

参见Using Export Clause in Libraries了解更多使用方式exports你的 dll 的部分,这似乎是你所缺少的。

顺便说一句,如果您要从 Delphi 转到 Delphi,则不需要 stdcall指示。请参阅:

If you want your library to be available to applications written in other languages, it's safest to specify stdcall in the declarations of exported functions. Other languages may not support Delphi's default register calling convention.

关于delphi - 访问 Delphi 应用程序中 DLL 中加载的 TClientDataset 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23624659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com