2008-09-29 62 views
15

通常,將16位Windows程序轉換爲Win32需要做些什麼?我確信我不是唯一一個繼承代碼庫的人,並且被驚呆地發現潛伏在角落的16位代碼。將Win16 C代碼轉換爲Win32

有問題的代碼是C.

+0

這是什麼樣的應用? – 2008-09-29 02:51:29

回答

15
  1. wParamlParam的含義在許多地方已經發生了變化。我強烈鼓勵你是偏執狂和儘可能轉換使用message crackers。他們會爲你解決頭痛問題。如果我只能給你一條建議,那就是了。
  2. 只要您使用的是信息破解程序,還可以啓用STRICT。它會幫助你使用int來捕獲Win16代碼庫,它應該使用HWND,HANDLE或其他東西。轉換這些將大大有助於這個列表中的#9。
  3. hPrevInstance沒用。確保它沒有被使用。
  4. 確保您使用Unicode友好的調用。這並不意味着你需要的一切轉化爲TCHAR S,而是指你更好地與CreateFile取代OpenFile_lopen_lcreat,命名現在明顯
  5. LibMainDllMain,整個庫格式和出口約定是不同的
  6. Win16沒有VMM。 GlobalAlloc,LocalAlloc,GlobalFreeLocalFree應替換爲更現代的等價物。完成後,清除對LocalLockLocalUnlock和朋友的呼叫;他們現在沒用了。不是說我可以想象你的應用程序正在做這件事,但要確保你在那裏時不依賴WM_COMPACTING
  7. Win16也沒有內存保護。確保你沒有使用SendMessagePostMessage發送指向進程外窗口的指針。您需要切換到更現代的IPC機制,例如管道或內存映射文件。
  8. Win16也缺乏搶先式多任務處理。如果您想從另一個窗口快速回答問題,撥打電話SendMessage並等待消息處理完畢很酷。這可能是一個壞主意。考慮PostMessage是否不是更好的選擇。
  9. 指針和整數大小發生變化。請記住仔細檢查您正在閱讀的任何地方或將數據寫入磁盤—,尤其是如果它們是Win16結構。您需要手動重做它們以處理較短的值。再次,處理這個問題的最不痛苦的方法是儘可能使用信息破解器。否則,您需要手動搜索並將int轉換爲DWORD等適用情況。
  10. 最後,當你明確指出時,考慮啓用64位編譯檢查。從16位到32位所面臨的許多問題與從32位到64位相同,而Visual C++現在實際上非常聰明。你不僅會捕捉到一些懸而未決的問題,你也可以準備好最終的Win64遷移。

編輯:作爲@ChrisN指出,the official guide for porting Win16 apps to Win32仍然是可用的,並且都fleshes出來,並增加了我上面的點。

1

原來的Win32 SDK中有一個工具,掃描的源代碼和標記,需要加以改變線路,但我不記得工具的名稱。

過去我不得不這樣做時,我使用了強力技術 - 例如: 1 - 更新生成文件或生成環境以使用32位編譯器和鏈接器。或者,只需在IDE中創建一個新項目(我使用Visual Studio),然後手動添加這些文件。

2 - 建立

3 - 修正錯誤

4 - 重複2〜3 &直到完成

過程中的痛苦取決於要遷移的應用程序。我已經在一個小時內轉換了10000個線路節目,並在不到一週的時間內轉換了75,000個線路節目。我也有一些小工具,我只是放棄並重寫(大部分)從頭開始。

0

我同意艾倫的看法,反覆試驗可能是最好的方法。

這裏有一些很好的tips

0

同意編譯器可能會捕獲大部分錯誤。另外,如果使用「near」和「far」指針,則可以刪除這些指定 - 指針只是Win32中的一個指針。

6

除了讓你的編譯環境吧,這裏有你需要解決幾個具體問題:

  1. 含整數結構需要改變以短期或從16位到32位擴大。如果您更改結構的大小並將其加載/保存到磁盤,則需要寫入數據文件升級代碼。

  2. 每個窗口數據通常使用GWL_USERDATA與窗口句柄一起存儲。如果將某些數據擴展到32位,則偏移量將會改變。

  3. POINT & Win32中的SIZE結構是64位。在Win16中,它們是32位,可以作爲DWORD返回(調用者將返回值分成兩個16位值)。這不再適用於Win32(即Win32不返回64位結果),並且函數被更改爲接受存儲返回值的指針。你將需要編輯所有這些。 API(如GetTextExtent)受此影響。同樣的問題也適用於某些Windows消息。

  4. 在Win32中不鼓勵使用INI文件,而採用註冊表。雖然INI文件功能仍然有效,但您需要注意Vista問題。 16位程序通常將其INI文件存儲在Windows系統目錄中。

這只是我能記得的幾個問題。自從我進行任何Win32移植以來已經有十多年了。一旦你進入它,它很快。每個代碼庫在移植你將習慣的時候都會有自己的「感覺」。你甚至可能會發現一些錯誤。