主程序:
MenuRec=record
menuid:pchar;
menuname:pchar;
menutxt:pchar;
menut:pchar;
mennts:integer;
menui:integer;
menuf:pchar;
end;
TRMenu = function():MenuRec;var
Form1: TForm1;
h:HMODULE;
RMenu:TRmenu;
b:PChar;
MenuR:MenuRec;procedure TForm1.Button1Click(Sender: TObject);
begin
h:=loadlibrary(pchar('C:\DELPHI程序\aaa\dll\project1.dll'));
RMenu:=GetProcAddress(h,'RMenu');
MenuR:=RMenu;
freelibrary(h);
end;DLL:
type
MenuRec=record
menuid:pchar;
menuname:pchar;
menutxt:pchar;
menut:pchar;
mennts:integer;
menui:integer;
menuf:pchar;
end;
function RMenu:MenuRec;stdcall;
var aa:MenuRec;
begin
aa.menuname:='database2';
aa.menutxt:='database2';
aa.menut:='data';
aa.mennts:=1;
aa.menui:=2;
aa.menuf:='dll1.dll';
result:=aa;
end;错误:“Access Violation at address 00000000.Read of address 00000000.”。
MenuRec=record
menuid:pchar;
menuname:pchar;
menutxt:pchar;
menut:pchar;
mennts:integer;
menui:integer;
menuf:pchar;
end;
TRMenu = function():MenuRec;var
Form1: TForm1;
h:HMODULE;
RMenu:TRmenu;
b:PChar;
MenuR:MenuRec;procedure TForm1.Button1Click(Sender: TObject);
begin
h:=loadlibrary(pchar('C:\DELPHI程序\aaa\dll\project1.dll'));
RMenu:=GetProcAddress(h,'RMenu');
MenuR:=RMenu;
freelibrary(h);
end;DLL:
type
MenuRec=record
menuid:pchar;
menuname:pchar;
menutxt:pchar;
menut:pchar;
mennts:integer;
menui:integer;
menuf:pchar;
end;
function RMenu:MenuRec;stdcall;
var aa:MenuRec;
begin
aa.menuname:='database2';
aa.menutxt:='database2';
aa.menut:='data';
aa.mennts:=1;
aa.menui:=2;
aa.menuf:='dll1.dll';
result:=aa;
end;错误:“Access Violation at address 00000000.Read of address 00000000.”。
改为
menuid:array[0..255] of char;
试试,全改
你的代码中要改几个地方!
主程序:
PMenuRec=^MenuRec;//定义一个指向记录的指针类型
MenuRec=record
menuid:pchar;
menuname:pchar;
menutxt:pchar;
menut:pchar;
mennts:integer;
menui:integer;
menuf:pchar;
end;
//TRMenu = function():MenuRec;这个函数声明不要,直接用DLL中函数
//声明即可
function RMenu:PMenuRec;stdcall;external 'C:\DELPHI程序
\aaa\dll\project1.dll';
var
Form1: TForm1;
h:HMODULE;
//RMenu:TRmenu;
b:PChar;
MenuR:PMenuRec;procedure TForm1.Button1Click(Sender: TObject);
begin
h:=loadlibrary(pchar('C:\DELPHI程序\aaa\dll\project1.dll'));
MenuR:=RMenu;//直接用函数名就可以了
b:=MenuR^.menutxt;//这样调用即可!!!!
showmessage(b);
freelibrary(h);
end;
//得到showmessage的消息显示为:'database2';
DLL:
type
PMenuRec=^MenuRec;//定义一个指向记录的指针类型
MenuRec=record
menuid:pchar;
menuname:pchar;
menutxt:pchar;
menut:pchar;
mennts:integer;
menui:integer;
menuf:pchar;
end;
var aa:MenuRec;//动态的数据,声明在外面,避免随着函数调用完毕而删除
//在函数内部声明的变量在函数调用完毕时都是无法访问的,栈数据被栈顶
//指针屏蔽了,这个要注意!!
function RMenu:PMenuRec;stdcall;
begin
aa.menuname:='database2';
aa.menutxt:='database2';
aa.menut:='data';
aa.mennts:=1;
aa.menui:=2;
aa.menuf:='dll1.dll';
result:=@aa;//返回记录的地址,因为这个DLL被映射到主程序的地址空间
//而aa这个变量不会随着函数调用完毕删除,所以这里返回它的地址,可以
//通过地址来访问相应的数据!
end;
好人做到底:)
对于DLL中的大的数据共享,一般就是几种办法:
1.利用内存映射文件来共享;
2.利用DLL在主程序地址空间的性质来共享。(本程序方法)