追蹤Loadpackage的源碼,可以把它分為兩部分:
Handle := SafeLoadLibrary(bplname); //這里調用winAPI的loadLibrary函數來加載bpl(因此其實bpl也可以認為是一個dll)
InitializePackage(Handle); //初始化這個bpl
進一步分解InitializePackage(Handle),發現它其實包括兩個部分
CheckForDuplicateUnits(Module); //這個部分我通過參考其他書籍和看它的代碼知道,這里是用來檢測是否多個不同的bpl是否有包含相同的unit.如果是,則raise一個exception。
@PackageLoad := GetProcAddress(Module, 'Initialize'); //這個部分是取得包的入口點函數的地址,然后調用這個入口點函數
if Assigned(PackageLoad) then
PackageLoad
else
raise EPackageError.CreateFmt(sInvalidPackageFile, [GetModuleName(Module)]);
現在改為如下:
hPackage := SafeLoadLibrary(ASvcFileName);
if hPackage = 0 then
raise EPackageError.CreateResFmt(@sErrorLoadingPackage,
[Name,SysErrorMessage(GetLastError)]);
try
//CheckForDuplicateUnits(hPackage); //這一行注釋掉
@PackageLoad := GetProcAddress(hPackage, 'Initialize'); //Do not localize
if Assigned(PackageLoad) then
PackageLoad
else
raise EPackageError.CreateFmt(sInvalidPackageFile, [GetModuleName(hPackage)]);
except
FreeLibrary(hPackage);
end;