所以,我有一個自己寫的運行時包。如果包是靜態鏈接的,那麼使用的項目就可以完全訪問導出的數據,因爲編譯器完全知道從它導入的內容,對嗎?但是也可以通過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. Microsoft Visual Studio〜C/C++運行時庫〜靜態/動態鏈接
- 5. GCC靜態庫鏈接VS動態鏈接
- 6. 加載時動態鏈接和運行時動態鏈接之間的區別
- 7. 在編譯時鏈接vs在運行時鏈接到std ::庫
- 8. php包括vs jquery負載
- 9. 如何使用cl.exe鏈接靜態庫? (指定運行時庫)
- 10. mxmlc中的靜態鏈接運行時共享庫
- 11. 如何添加靜態鏈接運行時程序集?
- 12. 靜態鏈接和編譯運行時w/compiletoMethod()表達式樹
- 13. 針對Visual C++ Express 2008的靜態運行時庫鏈接
- 14. VS2015不會靜態鏈接運行時庫
- 15. Qt中的靜態鏈接 - > VS 2008中的鏈接錯誤
- 16. 動態庫vs運行時的靜態庫
- 17. 負載測試 - 套接字連接在運行負載測試時中止
- 18. XE7鏈接運行時包問題
- 19. 動態鏈接到靜態鏈接?
- 20. import =動態鏈接? &include =靜態鏈接?
- 21. C++,VS2010:避免下載MS redistrubutable包。靜態鏈接?
- 22. 靜態鏈接庫
- 23. 鏈接靜態stdlib.so
- 24. 靜態鏈接glib2
- 25. gcc靜態鏈接
- 26. 靜態鏈接OpenCV
- 27. pthread靜態鏈接
- 28. 靜態鏈接libwinpthread
- 29. 鏈接靜態庫與靜態庫
- 30. UNIX:靜態庫鏈接到靜態庫
爲什麼不使用接口?這是將接口與實現分開的典型方式。 –
因爲接口仍然需要導入它們? – ZzZombo
嗯,沒有。您可以將它們定義在通用單元中,該單元位於可執行文件和其他軟件包引用的軟件包中。我們不知道你爲什麼要用這種方式使用軟件包。你確定這是對你的問題的最佳解決方案,無論它是什麼。 –