我正在維護Delphi和C++ Builder的VirtualTreeView組件。使用Delphi一切都很好,但是當我用C++ Builder編譯包時,Delphi單元中初始化部分的代碼不會被調用。有任何想法嗎?未調用初始化部分
未調用初始化部分
回答
當某個Delphi單元的initialization
/finalization
段沒有在C++ Builder項目中調用時,通常意味着Delphi單元沒有被鏈接到最終的可執行文件中,通常是因爲C++代碼沒有直接引用任何代碼在單位,所以它得到優化。與Delphi相比,C++ Builder對刪除未使用的代碼更加積極。在Delphi中,只需將一個單元添加到uses
子句就可強制將該單元鏈接到該單元。在C++中情況並非如此。如果C++代碼不使用.hpp
文件中的任何內容,則使用C++代碼中的Delphi單元的.hpp
文件不足以保證單元已鏈接。
Indy在其幾個單元中遇到了這個問題,最顯着的是IdAllAuthentications
,IdAllFTPListParsers
和IdAllHeaderCoders
。這些單元都只包含初始化/終止代碼,沒有接口代碼,所以它們生成的.hpp
文件基本上是空的。要強制連接,我必須將{$HPPEMIT}
語句添加到interface
部分,以便在生成的.hpp
文件中輸出#pragma link
語句。例如:
unit IdAllAuthentications;
interface
{
Note that this unit is simply for listing ALL Authentications in Indy.
The user could then add this unit to a uses clause in their program and
have all Authentications linked into their program.
ABSOLUTELY NO CODE is permitted in this unit.
}
{$I IdCompilerDefines.inc}
// RLebeau 2/14/09: this forces C++Builder to link to this unit so
// the units can register themselves correctly at program startup...
{$IFDEF HAS_DIRECTIVE_HPPEMIT_LINKUNIT}
{$HPPEMIT LINKUNIT}
{$ELSE}
{$HPPEMIT '#pragma link "IdAllAuthentications"'}
{$ENDIF}
implementation
// uses units that self-register in their initialization sections ...
end.
{$HPPEMIT LINKUNIT}
在XE5更新2引入,幫,帶的連接使用單位的範圍名稱單位:
新:您現在可以使用HPPEMIT Delphi編譯器指令用於連接和發電C++名稱空間聲明。
...
{$ HPPEMIT LINKUNIT}取代的#pragma鏈接,iOS設備的目標平臺。 有關更多信息,請參閱HPPEMIT。
對於C++應用,
{$HPPEMIT LINKUNIT}
在移動平臺上取代#pragma link
。德爾福運行時間有單位,必須鏈接,以便啓用一些功能。
{$HPPEMIT '#pragma link "<unitname>"'}
現在,你應該使用下面的指令,而不是:
{$HPPEMIT LINKUNIT}
LINKUNIT
生成#pragma link
聲明引用在C++中,自動連接,使用下面的指令之前實現調用單元使用正確的裝飾/名稱空間單元名稱。
我加入VirtualTreesCR.cpp文件中的以下行: 的#pragma鏈接「VirtualTrees」 而到了VirtualTrees.pas {$ HPPEMIT「的#pragma鏈接‘VirtualTrees’」} 但設計時包本身已經具備問題。我簡單地將VirtualTree放在一個窗體上,我得到一個AV,因爲一些變量沒有被賦值。 –
@Remy:我們可以在這些單元的方法和構造函數中設置斷點,所以我猜測單元已經鏈接了。有趣的是,我們不能在VirtualTrees單元的初始化部分的代碼中設置斷點。因此,這在C++ Builder中不受支持,或者單元的初始化部分沒有鏈接,但其餘的單元是。 –
- 1. nm的未初始化數據部分
- 2. 未初始化代碼的一部分
- 3. 分配未初始化片
- 4. C初始化部分
- 5. struct的部分初始化?
- 6. 部分初始化基類
- 7. ApplicationEventMulticaster未初始化 - 調用'refresh'
- 8. AudioTrack:play()對未初始化的AudioTrack調用
- 9. 自定義RecordReader初始化未調用
- 10. 實際初始化的未初始化的局部變量?
- 11. 使用未初始化值
- 12. C4700:未初始化的局部變量
- 13. 局部變量保持未初始化
- 14. 局部變量尚未初始化?
- 15. 未初始化的局部變量!
- 16. 未初始化的局部變量
- 17. ProgressIndicatior未初始化
- 18. SelectCommand.Connection未初始化
- 19. 值未初始化
- 20. SWFUpload未初始化
- 21. Phaser.State未初始化
- 22. Firebase未初始化
- 23. URLProtocol未初始化
- 24. Applet未初始化
- 25. java.lang.IllegalStateException:ApplicationEventMulticaster未初始化 -
- 26. TilesContainer未初始化
- 27. Module.DEFAULT_REFLECTOR未初始化
- 28. ImageView未初始化
- 29. CRT未初始化
- 30. Android:java.lang.NullPointerException:CameraUpdateFactory未初始化
我不能理解這個問題。它缺乏細節。你能否展示一些小的repro代碼來展示你的觀點。 –
您是否期望在C++ Builder下構建時編譯/執行Delphi代碼?這是兩種不同的語言...... –
@Jerry:我不能說羅馬語,但我當然希望Delphi代碼在C++ Builder中使用時被編譯和執行。你認爲VCL是什麼?而且有些令人不安的是,init或finit代碼不是從C++ Builder調用的。 –