簡體   English   中英

如何處理win32可執行資源?

[英]How are win32 executable resources handled?

我不知道為什么在Google上找到這個問題的答案是如此困難,但我想直截了當。

是否以相同的方式處理win32資源靜態數據是將數據保存在RAM中以用於整個進程運行時的位置,還是將它們保存在磁盤上,就像常規文件一樣,直到加載到內存中? 像LoadResource / LoadString這樣的函數意味着后者,但我想絕對肯定我不會被抽象所欺騙。

在過去的日子里(如Windows 3.1和更早版本),資源在加載過程中被復制到內存中,你只需要處理它們。 內存管理器可以執行諸如在內存中移動副本以對空間進行碎片整理,甚至秘密卸載資源,直到您再次需要它為止。 當您需要資源時,還有第二步將其“鎖定”到內存中。 這為您提供了指向副本的指針,並確保資源管理器在您再次解鎖之前不會移動它。

在32位版本的Windows中,不會復制資源。 可執行文件(或DLL)映射到內存中,如果您觸摸資源,虛擬內存管理器將確保它在那里。

API(FindResource,LoadResource,LockResource)反映了舊時代,資源句柄和句柄鎖定等。但是現在實現起來要簡單得多,因為句柄只是指向資源開頭的指針而且鎖定是有效的一個無操作,將句柄轉換為指針類型並返回它。

您可能會注意到所有資源API都接受hModule參數 - 這實際上是指向內存中模塊的PE頭的指針,而不是磁盤上文件的句柄。 因此,PE文件的資源部分( .rsrc )必須存在於程序的存儲空間中,以便這些API工作。 當然,與所有內存映射文件一樣,在需要之前,數據可能實際上並未被分頁到物理RAM中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM