本文主要是介绍loadPackage太慢的解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
追蹤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;
这篇关于loadPackage太慢的解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!