2015-11-16 61 views
4

我正在維護Delphi和C++ Builder的VirtualTreeView組件。使用Delphi一切都很好,但是當我用C++ Builder編譯包時,Delphi單元中初始化部分的代碼不會被調用。有任何想法嗎?未調用初始化部分

+1

我不能理解這個問題。它缺乏細節。你能否展示一些小的repro代碼來展示你的觀點。 –

+0

您是否期望在C++ Builder下構建時編譯/執行Delphi代碼?這是兩種不同的語言...... –

+0

@Jerry:我不能說羅馬語,但我當然希望Delphi代碼在C++ Builder中使用時被編譯和執行。你認爲VCL是什麼?而且有些令人不安的是,init或finit代碼不是從C++ Builder調用的。 –

回答

7

當某個Delphi單元的initialization/finalization段沒有在C++ Builder項目中調用時,通常意味着Delphi單元沒有被鏈接到最終的可執行文件中,通常是因爲C++代碼沒有直接引用任何代碼在單位,所以它得到優化。與Delphi相比,C++ Builder對刪除未使用的代碼更加積極。在Delphi中,只需將一個單元添加到uses子句就可強制將該單元鏈接到該單元。在C++中情況並非如此。如果C++代碼不使用.hpp文件中的任何內容,則使用C++代碼中的Delphi單元的.hpp文件不足以保證單元已鏈接。

Indy在其幾個單元中遇到了這個問題,最顯着的是IdAllAuthentications,IdAllFTPListParsersIdAllHeaderCoders。這些單元都只包含初始化/終止代碼,沒有接口代碼,所以它們生成的.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++中,自動連接,使用下面的指令之前實現調用單元使用正確的裝飾/名稱空間單元名稱。

+0

我加入VirtualTreesCR.cpp文件中的以下行: 的#pragma鏈接「VirtualTrees」 而到了VirtualTrees.pas {$ HPPEMIT「的#pragma鏈接‘VirtualTrees’」} 但設計時包本身已經具備問題。我簡單地將VirtualTree放在一個窗體上,我得到一個AV,因爲一些變量沒有被賦值。 –

+0

@Remy:我們可以在這些單元的方法和構造函數中設置斷點,所以我猜測單元已經鏈接了。有趣的是,我們不能在VirtualTrees單元的初始化部分的代碼中設置斷點。因此,這在C++ Builder中不受支持,或者單元的初始化部分沒有鏈接,但其餘的單元是。 –