Chr*_*ton 9 delphi initialization delphi-2005
我在.bpl中有一个单元,我需要一个我写的新函数的字符串列表.我希望stringlist在应用程序的生命周期内保持不变,这样每个调用都可以建立在之前调用的内容之上.
所以它在单元内全局声明,我在Initialization部分初始化它,如下所示:
var
ProductLookup : TStrings;
...
function foo : boolean;
begin
result := (ProductLookup.IndexOfName('bar') >=0); //blow up here. It's nil. Why?
end;
....
initialization
ProductLookup := TStringList.Create; // This should get run, but doesn't.
finalization
FreeAndNil(ProductLookup);
end.
Run Code Online (Sandbox Code Playgroud)
当我对它进行单元测试时,一切都很好.但是当它从主应用程序运行时,由于字符串列表为零而导致访问冲突.所以现在我在foo函数中检查nil并在必要时创建.但我不知道为什么初始化对我不起作用.我在初始化中放了一个调试消息,当它作为BPL加载时它不会运行,但如果我直接编译到我的dUnit exe中,它会运行.有任何想法吗?Delphi2005.
Rob*_*edy 24
达里安提醒我,我之前已经回答过:
如果操作系统在加载关联的EXE时加载BPL,则不会调用所有初始化部分.相反,只调用程序中其他东西显式使用的单元中的部分.
如果初始化部分中的代码注册了一个类,然后您只是间接引用该类,比如通过在列表中按名称查找它,则可能不会调用该单元的初始化部分.将该单元添加到程序中的任何"uses"子句应该可以解决该问题.
要解决此问题,您可以通过
InitializePackage在SysUtils单元中调用该函数来自行初始化包的单元.它需要一个模块句柄,您可以通过调用GetModuleHandleAPI函数获得该句柄.该函数只调用尚未初始化的单元的初始化部分.无论如何,这是我的观察.如果你打电话
InitializePackage,那么你也应该打电话FinalizePackage.当您的包被卸载时,将为所有自动初始化的单元调用终结部分.如果操作系统没有自动加载您的软件包,那么您将使用该
LoadPackage函数加载它.它会为您初始化所有包裹的单位,因此您无需InitializePackage自己打电话.同样,UnloadPackage将为您完成一切.
| 归档时间: |
|
| 查看次数: |
7762 次 |
| 最近记录: |