DBGrid在exe中,DataSource在dll中,出现内存错误的问题:(50分)

  • 主题发起人 主题发起人 liuchong
  • 开始时间 开始时间
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
//DLL代码(Dll中有
DataModule1;
con1: TADOConnection;
qry1: TADOQuery;
ds1: TDataSource;)
library MyDll;

uses
SysUtils,
Classes,
DB,
DM1 in 'DM1.pas' {DataModule1: TDataModule};

{$R *.res}

type
PDataSource=^TDataSource;

function GetDataSource():PDataSource;stdcall;
begin
with DataModule1.qry1 do
begin
SQL.Clear;
SQL.Add('SELECT * FROM AA');
Open;
end;
Result:=PDataSource(DataModule1.ds1);
end;

exports
GetDataSource;

begin
end.



exe中的代码:
implementation

{$R *.dfm}

type
PDataSource=^TDataSource;

var
H:THandle;
GetDataSource:function():PDataSource;stdcall;

procedure TForm1.btn1Click(Sender: TObject);
begin
H:=LoadLibrary('MyDll');
@GetDataSource:=GetProcAddress(H,'GetDataSource');
dbgrd1.DataSource:=GetDataSource()^;
end;

调用DLL出现内存错误,不知为何
 
{$R *.dfm}
function GetDataSource
external 'MyDll' name 'GetDataSource';

GetDataSource就可以直接使用了 不要那样
 
PDataSource=^TDataSource;
要这个干吗?多此一举。直接返回TDataSource就可以。
而且不知道你为什么这样设计,让人费解。
 
1你好像没有加入shearmem单元
2有Ado的时候要引入actixs单元
 
[合肥]飞刀(297099102) 08:36:36
DLL和EXE各有一套VCL体系,所以你这么相互之间赋值,根本行不通的,用动态包,就是为了让他们共用一个VCL类库系统

delphi的对象包含的首个数据内容就是VMT的入口地址,咱做个简单的测试,在DLL中个EXE中个创建一个TObject对象,看看同样的两个TObject的对象实例的VMT入口地址到底是不是一样的,你就明白了。如果连最最基础的TObject都不一样的话,你说还有哪个派生的类会一样?
 
后退
顶部