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;
procedure loadfile;stdcall;
procedure set_file(name_of_file:string);stdcall;
var
StudentModule: TStudentModule;
filename:string;
implementation
procedure set_file(name_of_file: string);stdcall;
begin
filename:=name_of_file;
end;
procedure loadfile;stdcall;
begin
StudentModule.StudentSet.LoadFromFile(filename);
end;
end.
这是我在DLL中包含的单元,我已经在export子句中导出了函数loadfile。 当我在程序中使用此函数时,我会收到地址违规的错误读取。 我需要在TClientDataSet上执行操作,如加载并保存在Dll中,然后在程序中使用它们。 首先,我调用set_file方法初始化文件名 请帮我解决这个问题。 在期待中感谢你。
答案 0 :(得分:4)
您需要先创建数据模块。您正在尝试使用尚不存在的对象。这就是您看到访问冲突的原因。您在文件名中也没有值。你应该做的是这样的事情:
procedure loadfile; stdcall;
var
studentDataModule: TStudentModule;
fileToLoad: string;
begin
studentDataModule := TStudentModule.Create(nil);
try
// Set filename to something
fileToLoad := 'Myfile.dat';
// Load the file
StudentModule.StudentSet.LoadFromFile(fileToLoad);
// Do something else
...
finally
studentDataModule.Free;
end;
end;
我没有故意使用你的两个全局变量。没有什么可以初始化这些。