2013-03-14 103 views
0

我想要做的是製作一個遊戲和一個啓動器,以更新遊戲。在不覆蓋exe文件的情況下更新遊戲

此啓動器將更新遊戲而不覆蓋遊戲的.exe文件。

我也認爲這是通過使用DLL可能的,但我不知道在哪裏學這...

這可能嗎?

+0

這是可能的,但我擔心你的問題有點過於籠統,無法在本網站上得到解答。 – FLClover 2013-03-14 12:49:39

+1

您必須將啓動程序作爲獨立應用程序來執行,因爲如果從「Game.exe」啓動該啓動程序,您將擁有已在使用的.DLL。 – LukeHennerley 2013-03-14 12:50:49

回答

0

有很多來源可以學習如何製作一個dll項目。

開始與微軟教程 - http://msdn.microsoft.com/en-us/library/ms235636(v=vs.100).aspx

仔細想想你的遊戲從一開始設計。爲了使它更容易管理和易於更新,你可能想將你的遊戲分成核心部分,即物理,渲染等,並將其作爲dll。

如果在以後的日期升級渲染器,則只需要交換dll,或者如您所說,有一個Launcher覆蓋客戶端計算機上的渲染器dll。

使用dll的一些缺點是你現在需要用更多的文件來發布遊戲,並且最終用戶可能會發現爲了自己的修改目的而包裝你的dll是比較容易的(儘管也許你會發現使遊戲的可修改性更好? )。

1

這聽起來像你希望修改正在運行的進程的內存而不修改可執行文件(無論是遊戲還是其他程序)。

您可以使用ReadProcessMemory和WriteProcessMemory API調用(它們屬於kernel32.dll庫)讀取和寫入正在運行的進程的內存。 在讀取和寫入內存之前,您還需要使用OpenProcess創建一個有效的進程句柄。

根據您使用的是哪種語言,訪問它們非常簡單。在C#中,你需要使用下面的語法來聲明一個DLL導入:

[DllImport("kernel32.dll")] 
public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId); 

[DllImport("kernel32.dll")] 
public static extern bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress, ref byte[] buffer, int size, ref int lpNumberOfBytesRead); 

[DllImport("kernel32.dll")] 
public static extern bool WriteProcessMemory(IntPtr hProcess, int lpBaseAddress, ref byte[] buffer, int size, ref int lpNumberOfBytesWritten); 

然後你得到一個手柄使用OpenProcess進程,讀取和寫入使用ReadProcessMemory內存和WriteProcessMemory的適當。

您可以使用像OLLYDBG這樣的調試工具來幫助您找出您想要編輯的存儲位置。另一個好工具是ArtMoney,它允許您監控和跟蹤運行過程中的值,以識別存儲遊戲信息的位置,例如金錢,健康等等。

如果您需要進一步的幫助,可以添加一些關於您正在做什麼的更多信息。