我有一些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格式。我需要将加载的数据集的内容移动到我想要显示数据的应用程序。 请帮我这样做。 谢谢
答案 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的默认寄存器 召集会议。