访问DLL中的TClientDataSet

时间:2014-05-12 05:00:41

标签: delphi dll delphi-7 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;

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方法初始化文件名 请帮我解决这个问题。 在期待中感谢你。

1 个答案:

答案 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;

我没有故意使用你的两个全局变量。没有什么可以初始化这些。