C
clxbase
Unregistered / Unconfirmed
GUEST, unregistred user!
情况是这样的,我做了一个个头比较大的bpl,该bpl没有require任何其他bpl,也就是说,rtl等东西都编译在里面了。我在另一程序中通过LoadLibrary调用该bpl,在其中的一个函数中,我对bpl進行初始化,写InitializePackage(hInstance)。结果,发现了一个奇怪的现象,那就是,如果bpl包含了某些第三方组件的Unit,则调用该函数的时候,会报AV错误。经过我的追踪,发现问题出现在InitializePackage函数中,進一步追踪,在InitializePackage(SysUtils.pas)中:
procedure InitializePackage(Module: HMODULE);
type
TPackageLoad = procedure;
var
PackageLoad: TPackageLoad;
begin
CheckForDuplicateUnits(Module);
@PackageLoad := GetProcAddress(Module, 'Initialize'); //Do not localize
if Assigned(PackageLoad) then
PackageLoad
else
raise EPackageError.CreateFmt(sInvalidPackageFile, [GetModuleName(Module)]);
end;
发现异常出在PackageLoad一句上,也就是调用当前bpl的名叫‘Initialize’的导出函数中。那么,在Delphi编译的bpl的动态库入口函数中,似乎为每个unit作了一定的初始化调用,似乎每个unit在编译后都生成了一个隐含的函数体,负责对该unit進行一定的初始化工作,而每个Unit对应的这个隐含的函数都汇总到dll入口函数Initialize函数中被统一调用。那么奇怪的问题来了:我诧异的发现,出现问题的Unit并没有initialization部分,那么,是在干什么的时候导致的AV呢?除了initialization以外,还有哪些情况会导致在Unit的隐含初始化函数中产生内容呢?const值的初始化会不会在动态库加载的时候進行?
这个问题恐怕得像周爱民(《Delphi源码分析》作者)这样的人才可能回答。
procedure InitializePackage(Module: HMODULE);
type
TPackageLoad = procedure;
var
PackageLoad: TPackageLoad;
begin
CheckForDuplicateUnits(Module);
@PackageLoad := GetProcAddress(Module, 'Initialize'); //Do not localize
if Assigned(PackageLoad) then
PackageLoad
else
raise EPackageError.CreateFmt(sInvalidPackageFile, [GetModuleName(Module)]);
end;
发现异常出在PackageLoad一句上,也就是调用当前bpl的名叫‘Initialize’的导出函数中。那么,在Delphi编译的bpl的动态库入口函数中,似乎为每个unit作了一定的初始化调用,似乎每个unit在编译后都生成了一个隐含的函数体,负责对该unit進行一定的初始化工作,而每个Unit对应的这个隐含的函数都汇总到dll入口函数Initialize函数中被统一调用。那么奇怪的问题来了:我诧异的发现,出现问题的Unit并没有initialization部分,那么,是在干什么的时候导致的AV呢?除了initialization以外,还有哪些情况会导致在Unit的隐含初始化函数中产生内容呢?const值的初始化会不会在动态库加载的时候進行?
这个问题恐怕得像周爱民(《Delphi源码分析》作者)这样的人才可能回答。