2015-04-12 42 views
0

所以,我有一個自己寫的運行時包。如果包是靜態鏈接的,那麼使用的項目就可以完全訪問導出的數據,因爲編譯器完全知道從它導入的內容,對嗎?但是也可以通過LoadPackage()動態加載一個包。但是,如何使用導入的複雜數據結構(如類)呢?除了使用FindClass('TSomeClass')構造複雜表達式並調用RTTI對導入類的實例進行操作外,我無法找到一種可行的方法。運行時包負載vs靜態鏈接

+0

爲什麼不使用接口?這是將接口與實現分開的典型方式。 –

+0

因爲接口仍然需要導入它們? – ZzZombo

+0

嗯,沒有。您可以將它們定義在通用單元中,該單元位於可執行文件和其他軟件包引用的軟件包中。我們不知道你爲什麼要用這種方式使用軟件包。你確定這是對你的問題的最佳解決方案,無論它是什麼。 –

回答

4

編譯器完全知道包中的內容,因爲DCU和DCP文件告訴它有什麼。

IDE知道包中的內容,因爲它知道如何在所有單元中找到Register過程,並且該過程告訴IDE關於可用類的信息。

在大多數情況下,程序知道程序包中包含了什麼,因爲程序使用了該程序包中的單元,編譯器確保在運行時在這些單元中提及事物的名稱將解析爲BPL文件中的相應內容。這包括在程序的導入表中提及BPL文件,以便操作系統自動加載BPL。

如果您希望加載的BPL列表只能在運行時確定,那麼您不能使用這些軟件包中的任何單位。您必須動態加載包。

如何使用這些軟件包中的內容仍然存在。你可能嘗試用RTTI發現整個內容。雖然這不是野餐。相反,定義所有相關模塊將使用的中間包。

爲所有包的類定義接口或公共基類。把這個類的定義放在一個單獨的包中,我們將其稱爲Shared.bpl。將該軟件包包含在您的EXE的所有其他軟件包的「requires」列表中。現在,一切都可以引用共享單元和公共基類。

這正是德爾福本身所做的。共享包稱爲RTL和VCL。這裏已經定義了幾個通用的基類,包括TComponent。就你而言,這聽起來像你需要一些超出TComponent的共同定義。