dll和exe内存共享问题。
有这样一个现象:
当exe和dll引用同一个forms.pas文件以后,那么请看下面代码:
library mydll
interface
uses
windows,sysutils,forms;
procedure test;external;stdcall;
implementation
{$R *.res}
procedure test;external;stdcall;
begin
showmessage(application.title);
end;
end.
///////////////////////////////////
program myexe
uses
windows,sysutils,forms;
{$R *.res}
var
hlib:dword;
p:tprocedure;
begin
application.initialize;
application.title:='ok!'
hlib:=loadlibrary("mydll.dll");
p:=getprocaddress(hlib,"test");
if assigned(p) then p();//竟然能够显示'ok!'
freelibrary(hlib);
application.run;
end.
//////////////////////////
我们知道,application是forms.pas单元中的全局变量。
dll里面并没有对application做初始化,但是调用test的时候,dll里访问了在exe中做好了初始化的application变量。
问题:
是不是因为同一个进程中exe和dll共享一切内存,完全透明,并且只要引用了同一个单元,那么在任何编译好的pe文件中,该单元的资源,比如全局变量、常量、函数等,都被固化到了相同的rva地址?