回答
wParam
和lParam
的含義在許多地方已經發生了變化。我強烈鼓勵你是偏執狂和儘可能轉換使用message crackers。他們會爲你解決頭痛問題。如果我只能給你一條建議,那就是了。- 只要您使用的是信息破解程序,還可以啓用
STRICT
。它會幫助你使用int
來捕獲Win16代碼庫,它應該使用HWND
,HANDLE
或其他東西。轉換這些將大大有助於這個列表中的#9。 hPrevInstance
沒用。確保它沒有被使用。- 確保您使用Unicode友好的調用。這並不意味着你需要的一切轉化爲
TCHAR
S,而是指你更好地與CreateFile
取代OpenFile
,_lopen
和_lcreat
,命名現在明顯 LibMain
爲DllMain
,整個庫格式和出口約定是不同的- Win16沒有VMM。
GlobalAlloc
,LocalAlloc
,GlobalFree
和LocalFree
應替換爲更現代的等價物。完成後,清除對LocalLock
,LocalUnlock
和朋友的呼叫;他們現在沒用了。不是說我可以想象你的應用程序正在做這件事,但要確保你在那裏時不依賴WM_COMPACTING
。 - Win16也沒有內存保護。確保你沒有使用
SendMessage
或PostMessage
發送指向進程外窗口的指針。您需要切換到更現代的IPC機制,例如管道或內存映射文件。 - Win16也缺乏搶先式多任務處理。如果您想從另一個窗口快速回答問題,撥打電話
SendMessage
並等待消息處理完畢很酷。這可能是一個壞主意。考慮PostMessage
是否不是更好的選擇。 - 指針和整數大小發生變化。請記住仔細檢查您正在閱讀的任何地方或將數據寫入磁盤—,尤其是如果它們是Win16結構。您需要手動重做它們以處理較短的值。再次,處理這個問題的最不痛苦的方法是儘可能使用信息破解器。否則,您需要手動搜索並將
int
轉換爲DWORD
等適用情況。 - 最後,當你明確指出時,考慮啓用64位編譯檢查。從16位到32位所面臨的許多問題與從32位到64位相同,而Visual C++現在實際上非常聰明。你不僅會捕捉到一些懸而未決的問題,你也可以準備好最終的Win64遷移。
編輯:作爲@ChrisN指出,the official guide for porting Win16 apps to Win32仍然是可用的,並且都fleshes出來,並增加了我上面的點。
原來的Win32 SDK中有一個工具,掃描的源代碼和標記,需要加以改變線路,但我不記得工具的名稱。
過去我不得不這樣做時,我使用了強力技術 - 例如: 1 - 更新生成文件或生成環境以使用32位編譯器和鏈接器。或者,只需在IDE中創建一個新項目(我使用Visual Studio),然後手動添加這些文件。
2 - 建立
3 - 修正錯誤
4 - 重複2〜3 &直到完成
過程中的痛苦取決於要遷移的應用程序。我已經在一個小時內轉換了10000個線路節目,並在不到一週的時間內轉換了75,000個線路節目。我也有一些小工具,我只是放棄並重寫(大部分)從頭開始。
我同意艾倫的看法,反覆試驗可能是最好的方法。
這裏有一些很好的tips。
同意編譯器可能會捕獲大部分錯誤。另外,如果使用「near」和「far」指針,則可以刪除這些指定 - 指針只是Win32中的一個指針。
除了讓你的編譯環境吧,這裏有你需要解決幾個具體問題:
含整數結構需要改變以短期或從16位到32位擴大。如果您更改結構的大小並將其加載/保存到磁盤,則需要寫入數據文件升級代碼。
每個窗口數據通常使用GWL_USERDATA與窗口句柄一起存儲。如果將某些數據擴展到32位,則偏移量將會改變。
POINT & Win32中的SIZE結構是64位。在Win16中,它們是32位,可以作爲DWORD返回(調用者將返回值分成兩個16位值)。這不再適用於Win32(即Win32不返回64位結果),並且函數被更改爲接受存儲返回值的指針。你將需要編輯所有這些。 API(如GetTextExtent)受此影響。同樣的問題也適用於某些Windows消息。
在Win32中不鼓勵使用INI文件,而採用註冊表。雖然INI文件功能仍然有效,但您需要注意Vista問題。 16位程序通常將其INI文件存儲在Windows系統目錄中。
這只是我能記得的幾個問題。自從我進行任何Win32移植以來已經有十多年了。一旦你進入它,它很快。每個代碼庫在移植你將習慣的時候都會有自己的「感覺」。你甚至可能會發現一些錯誤。
在MSDN上的文章Porting 16-Bit Code to 32-Bit Windows中有一個權威指南。
- 1. 使用驅動程序將Win16下的應用程序轉換爲win32
- 2. C++ Win32:將掃描代碼轉換爲Unicode字符
- 3. 將Java代碼轉換爲C#代碼
- 4. 將PHP代碼轉換爲C#代碼
- 5. 將JavaScript代碼轉換爲C代碼
- 6. 將僞代碼轉換爲C#代碼
- 7. 作業:將轉換後的僞代碼轉換爲C代碼
- 8. iPhone:將C#代碼轉換爲Objective-C
- 9. 將行代碼從C++轉換爲C
- 10. 將C++代碼轉換爲C#
- 11. 如何將C#代碼轉換爲C++
- 12. 如何將C#代碼轉換爲C++?
- 13. 轉換C++代碼轉換爲C#:SendMessageTimeout()
- 14. 需要將JavaScript代碼轉換爲C#
- 15. 將c#代碼轉換爲python
- 16. 將JAVA代碼KeyStore.getInstance轉換爲c#
- 17. 將C++代碼轉換爲Mips
- 18. 將C#代碼行轉換爲IronPython
- 19. 將C#代碼轉換爲vb.net
- 20. 將僞代碼轉換爲C
- 21. 將代碼行從VB轉換爲C#
- 22. 將C代碼轉換爲Java
- 23. 將C代碼轉換爲Java:指針
- 24. 將PHP加密代碼轉換爲C#
- 25. 將matlab代碼轉換爲c
- 26. 將fft代碼從Matlab轉換爲C#
- 27. 將代碼片段轉換爲C#
- 28. 將vb代碼轉換爲c#/ bool
- 29. 將xaml轉換爲C#代碼
- 30. 如何將VC++代碼轉換爲C#?
這是什麼樣的應用? – 2008-09-29 02:51:29