2011-05-29 40 views
2

我正在編寫一個可編寫腳本的遊戲引擎,爲此我有大量執行各種任務的類。引擎的大小正在迅速增長,所以我想將大型可執行文件分解爲dll模塊,以便只包含遊戲編寫器實際使用的組件。當用戶編譯他們的遊戲(也就是他們的腳本)時,我希望正確的dll是最終可執行文件的一部分。我已經有相當多的覆蓋數據,所以我想我可能能夠將dll存儲爲此塊的一部分。我的問題歸結爲:LoadLibrary從文件中的偏移量

是否有可能欺騙LoadLibrary來啓動讀取該文件在一定的偏差?這將使我不必將DLL提取到不乾淨的臨時文件中,或者將dll的自動包含完全廢除,並簡單地指示我的用戶將dll與遊戲一起打包。

起初,我想過要去進場的「從內存中加載DLL」,但拒絕了便攜性的理由,只是因爲它看起來像這樣可怕的黑客。

有什麼想法?

親切的問候,

菲利普Bennefall

+1

你似乎正在描述靜態鏈接的一個非常複雜的重塑。這就是靜態鏈接的全部內容 - 包括可執行文件中庫代碼的必要部分。 – 2011-05-29 16:00:27

+0

那麼,這幾乎是我想要做的,但它必須基於腳本內容來完成。因此,我不能預編譯它,因爲這會導致我回到目前的位置。當用戶「編譯」他們的遊戲時,這不是一個真正的C++編譯;它僅僅是編譯它自己的高級字節碼的腳本引擎。然後將該字節碼加密並附加到引擎可執行文件的副本中,該引擎可執行文件的副本將檢查其開始執行時是否附加有適當的覆蓋數據。 – 2011-05-29 16:11:10

+0

聽起來就像您需要一個工具來確定引擎的哪些部分處於未使用狀態,然後重新鏈接引擎可執行文件,可以使用實際的鏈接器或自己的工具來重新處理文件。 – 2011-05-29 16:34:47

回答

2

您正試圖解決不存在的問題。加載DLL實際上並不需要任何物理內存。 Windows爲DLL內容創建一個內存映射文件。當您的程序調用該代碼時,DLL中的代碼只會被加載。未使用的代碼不需要超出保留內存頁面的任何系統資源。你在32位操作系統上有20億字節的價值。你必須編寫一個很多的代碼來消耗它們全部,50兆字節的機器代碼已經是一個非常大的程序。

存儲映射是還你不能讓調用LoadLibrary()的原因,你想要做什麼。在你需要的地方沒有現實的場景。

查找到連接器的/ DELAYLOAD選項,以提高啓動性能。

1

我認爲該任務每一個解決方案是「可怕的黑客」,僅此而已。

最簡單的方式,我看到的是創建自己的虛擬驅動器當前的文件系統定製和黑客系統訪問路徑從一個真正的文件(你的庫編譯)到多個單獨的DLL-S。比如像TrueCrypt那樣(它是開源的)。而且,您可以使用LoadLibrary函數而無需更改。

但是,只有我看到正確的做法是改變你的工作,不要使用此方法。我認爲你需要創建你自己的腳本解釋器和編譯器,使用結構,指針等等。

最主要的是我不明白你使用庫的好處。我認爲目前編譯的代碼並不重要,可能打包得很好。任何其他資源可能會在第一次通話時動態加載。您所需要做的就是以正確的方式組織腳本引擎所有組件的工作週期。

相關問題