2011-01-06 32 views
9

我有一個.bpl單位,我需要一個字符串列表我寫了一個新的函數。我希望字符串列表在應用程序的整個生命週期內持續存在,以便每次調用都可以基於之前的調用發現。德爾福單位初始化不總是調用

所以它宣佈在全球範圍內的單位,我初始化它的初始化部分,像這樣:

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. 

當我單元測試它,一切都很好。但是當它從主應用程序運行時,我因爲訪問衝突而爆炸,因爲stringlist是零。所以現在我正在檢查foo函數中的nil,並在必要時創建。但我不知道爲什麼初始化不適合我。我在初始化時在那裏放了一個調試消息,當它作爲BPL加載時,它不會運行,但是如果我直接編譯到我的dUnit exe文件中,它會運行。有任何想法嗎? Delphi2005。

+3

退房羅伯肯尼迪的答案在這裏:http://groups.google.com/group/borland.public.delphi.language.delphi.general/browse_thread/thread/5f73d43146d4d8dc/cc4740216011f633?hl=en&ie=UTF- 8&q = delphi + bpl + initialization – 2011-01-06 19:18:55

回答

24

達裏安提醒我,I've answered this before

如果操作系統加載BPL裝載的是相關的EXE的一部分,那麼不是所有的初始化部分將被調用。相反,只有程序中其他內容明確使用的單元部分纔會被調用。

如果初始化部分中的代碼註冊了一個類,然後您只是間接引用該類,例如通過在列表中查找它的名稱,那麼可能不會調用該單元的初始化部分。將該單元添加到程序中的任何「使用」子句應該可以解決該問題。

要解決此問題,您可以通過在SysUtils單元中調用InitializePackage函數自行初始化包的單位。它需要一個模塊句柄,您可以通過調用GetModuleHandle API函數獲得該句柄。該函數只會調用尚未初始化的單元的初始化部分。無論如何,這是我的觀察。

如果您致電InitializePackage,那麼您也應該致電FinalizePackage。當你的軟件包被卸載時,最終化部分將被調用所有自動初始化的單元。

如果操作系統不是而不是會自動加載您的軟件包,那麼您正在使用LoadPackage函數加載它。它會爲您初始化所有包裝單位,因此您無需自己致電InitializePackage。同樣,UnloadPackage將爲您完成所有事情。

0

你是如何加載bpl的?你將它留給德爾福做加載,或者你手動加載bpl?如果你手動加載bpl,你是加載它作爲一個「直」dll或者你使用LoadPackage加載它作爲delphi包?我認爲要麼通過vcl加載它(通過需要的處理)或使用LoadPackage是由vcl運行的初始化部分所需的...

1

並非BPL中的每個單元都必須初始化某些情況下。如果我不得不猜測,我會說這個BPL在加載時與您的程序相關聯,並且以後不會動態加載?嘗試將您使用的設備的名稱放入程序的中,並在DPR中使用列表。這應該解決它。

+0

這裏的複雜情況是,大約有100個不同的EXE和.BPL使用這個特定的.BPL,我不允許重建它們。所以明智的方法並不總是奏效。好主意,+1通常是一種很好的技術。 – 2011-01-06 21:22:05

3

只在質量中心找到一個參考,但可能會有更多。包含LoadPackage引用的解決方法。

http://qc.embarcadero.com/wc/qcmain.aspx?d=61968

+0

看起來像我的問題。 +1 – 2011-01-06 21:23:46

+0

請注意[QualityCentral現在已關閉](https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward),因此您無法訪問「qc.embarcadero.com」鏈接了。如果您需要訪問舊的QC數據,請查看[QCScraper](http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)。 – 2017-06-09 17:23:18