2009-12-25 72 views
0

我正在寫DirectX 6.1庫到DirectX 9.0c的windows32鉤子;想法是將DX 6.1 3D設備的所有調用替換爲Direct 9.0c的調用並注入一些自定義代碼,因此我正在修補(99年)的舊遊戲將能夠使用着色器,後期效果等。以編程方式獲取DirectX 6.1的設備上限(DDraw4)

舊的DX 6.1 3D設備是通過創建DDraw模塊創建的。遊戲然後列舉設備上限。在我的模塊中,整個DDraw模塊被滑動,並且3D視圖被初始化。所以我有問題,因爲我不能給遊戲Ddraw4設備上限,因爲我根本沒有DDraw設備!

所以我的問題是如何獲得DDraw4設備上限,而無需初始化DDraw4設備。也許只要創建固定列表並將其提供給遊戲就足夠了,但我不知道該列表上應該包含什麼內容(我給出了我認爲應該的內容,並且遊戲退出了 - 記錄器顯示它只是在設備上限之後檢查)

回答

0

解決方案有點粗糙,但最重要的是 - 工作完美無瑕。

我已經編寫了一個小型獨立實用程序,它初始化DDraw 6.1,比獲取設備大小,然後將它們轉儲到磁盤上的文件(設備大小是普通的舊C格式結構,因此保存它非常簡單)和退出。然後,我可以從磁盤讀取設備上限文件,並在應用程序詢問我時向他們返回。

3

我從來沒有嘗試過這一點,但你可以嘗試以下。假設你沒有6.1 SDK,你可以自己製作DDCAPS結構(DirectDraw)(它基本上只是DWORD),然後使用DX9 GetDeviceCaps函數獲得功能(D3DCAPS9)。接下來,從獲得的上限(使用DX9)中獲取所需的值,並在DDCAPS結構中設置DirectDraw的等效值。然後,您可以將這個填充的頂蓋結構添加到遊戲中。一些注意事項 - 正如你所提到的,你不知道它具體需要什麼,所以這是一種碰撞和錯過(除非你有源代碼)。此外,對於caps結構值(在DX9和DDraw之間),可能沒有1:1映射。最後 - 如果你不知道標誌值,那麼你可能會在根據獲取的上限設置值時錯誤地設置標誌。正如我所提到的,這可能會有所改變(或者需要大量的偵探工作),但我認爲這可能是您可以嘗試的。

相關問題