所以,我有一個自己寫的運行時包。如果包是靜態鏈接的,那麼使用的項目就可以完全訪問導出的數據,因爲編譯器完全知道從它導入的內容,對嗎?但是也可以通過LoadPackage()動態加載一個包。但是,如何使用導入的複雜數據結構(如類)呢?除了使用FindClass('TSomeClass')構造複雜表達式並調用RTTI對導入類的實例進行操作外,我無法找到一種可行的方法。運行時包負載vs靜態鏈接
0
A
回答
4
編譯器完全知道包中的內容,因爲DCU和DCP文件告訴它有什麼。
IDE知道包中的內容,因爲它知道如何在所有單元中找到Register
過程,並且該過程告訴IDE關於可用類的信息。
在大多數情況下,程序知道程序包中包含了什麼,因爲程序使用了該程序包中的單元,編譯器確保在運行時在這些單元中提及事物的名稱將解析爲BPL文件中的相應內容。這包括在程序的導入表中提及BPL文件,以便操作系統自動加載BPL。
如果您希望加載的BPL列表只能在運行時確定,那麼您不能使用這些軟件包中的任何單位。您必須動態加載包。
如何使用這些軟件包中的內容仍然存在。你可能嘗試用RTTI發現整個內容。雖然這不是野餐。相反,定義所有相關模塊將使用的中間包。
爲所有包的類定義接口或公共基類。把這個類的定義放在一個單獨的包中,我們將其稱爲Shared.bpl。將該軟件包包含在您的EXE的所有其他軟件包和的「requires」列表中。現在,一切都可以引用共享單元和公共基類。
這正是德爾福本身所做的。共享包稱爲RTL和VCL。這裏已經定義了幾個通用的基類,包括TComponent
。就你而言,這聽起來像你需要一些超出TComponent
的共同定義。
相關問題
- 1. 靜態/動態運行時鏈接
- 2. 用Python運行時Cython靜態鏈接?
- 3. Angular的深層鏈接 - 動態鏈接vs靜態鏈接
- 4. 加載時動態鏈接和運行時動態鏈接之間的區別
- 5. 在編譯時鏈接vs在運行時鏈接到std ::庫
- 6. 如何添加靜態鏈接運行時程序集?
- 7. VS2015不會靜態鏈接運行時庫
- 8. mxmlc中的靜態鏈接運行時共享庫
- 9. 如何使用cl.exe鏈接靜態庫? (指定運行時庫)
- 10. 針對Visual C++ Express 2008的靜態運行時庫鏈接
- 11. Qt中的靜態鏈接 - > VS 2008中的鏈接錯誤
- 12. 負載測試 - 套接字連接在運行負載測試時中止
- 13. 靜態鏈接OpenCV
- 14. gcc靜態鏈接
- 15. 鏈接靜態stdlib.so
- 16. pthread靜態鏈接
- 17. UNIX:靜態庫鏈接到靜態庫
- 18. 鏈接到鏈接到靜態.lib的靜態.lib的問題
- 19. 編譯「壓力ng」包的靜態鏈接可執行文件
- 20. QtConcurrent ::重載的靜態方法運行
- 21. 負載字符串數組在運行時動態
- 22. 如何將Visual C運行時靜態鏈接到我的程序中?
- 23. 使用靜態庫鏈接時鏈接錯誤
- 24. 鏈接器錯誤,當庫靜態鏈接時glew
- 25. 靜態鏈接優勢
- 26. 靜態鏈接SHFolder組件
- 27. 靜態庫鏈接失敗
- 28. Fortran中的靜態鏈接
- 29. 鏈接到靜態庫
- 30. 靜態庫鏈接兩次
爲什麼不使用接口?這是將接口與實現分開的典型方式。 –
因爲接口仍然需要導入它們? – ZzZombo
嗯,沒有。您可以將它們定義在通用單元中,該單元位於可執行文件和其他軟件包引用的軟件包中。我們不知道你爲什麼要用這種方式使用軟件包。你確定這是對你的問題的最佳解決方案,無論它是什麼。 –