将Win16 C代码转换为Win32

时间:2008-09-29 02:48:48

标签: c windows winapi 16-bit

一般来说,将16位Windows程序转换为Win32需要做些什么?我确信我不是唯一一个继承代码库的人,并且被震惊地发现潜伏在角落里的16位代码。

有问题的代码是C。

6 个答案:

答案 0 :(得分:15)

  1. 许多地方wParamlParam的含义发生了变化。我强烈鼓励你变得偏执并尽可能地转换为使用message crackers。他们将为您免除头痛。如果只有一条我可以给你的建议,那就是它。
  2. 只要您使用邮件破解程序,也请启用STRICT。它会帮助您使用int来捕获Win16代码库,它应该使用HWNDHANDLE或其他内容。转换这些将大大有助于此列表中的#9。
  3. hPrevInstance没用。确保它没有使用。
  4. 确保您使用的是Unicode友好的呼叫。这并不意味着您需要将所有内容转换为TCHAR s,但这意味着您最好将OpenFile_lopen_lcreat替换为CreateFile来命名
  5. LibMain现在为DllMain,整个图书馆格式和导出约定不同
  6. Win16没有VMM。 GlobalAllocLocalAllocGlobalFreeLocalFree应替换为更现代的等价物。完成后,清除对LocalLockLocalUnlock和朋友的通话;他们现在没用了。并不是说我可以想象你的应用是这样做的,但请确保你在那里时不依赖于WM_COMPACTING
  7. Win16也没有内存保护。确保您没有使用SendMessagePostMessage发送指向进程外窗口的指针。您需要切换到更现代的IPC机制,例如管道或内存映射文件。
  8. Win16也缺乏先发制人的多任务处理。如果您想从另一个窗口快速回答,那么调用SendMessage并等待处理该消息非常酷。现在这可能是一个坏主意。考虑PostMessage是不是更好的选择。
  9. 指针和整数大小发生变化。请记住仔细检查您正在读取或向磁盘写入数据的任何位置 - 特别是如果它们是Win16结构。您需要手动重做它们以处理较短的值。同样,处理这个问题的最不痛苦的方法是尽可能使用消息破解程序。否则,您需要手动搜寻并将int转换为DWORD,依此类推。
  10. 最后,当您明确指出时,请考虑启用64位编译检查。从16位到32位所面临的许多问题与从32位到64位相同,而Visual C ++实际上非常聪明。你不仅会遇到一些挥之不去的问题;您也可以为最终的Win64迁移做好准备。

  11. 编辑:正如@ChrisN指出的那样,the official guide for porting Win16 apps to Win32仍然可用,并且两者都充实并增加了我的观点。

答案 1 :(得分:6)

除了让您的构建环境正确之外,以下是您需要解决的一些细节:

  1. 包含整数的结构需要更改为短或从16位扩展到32位。如果更改结构的大小并将其加载/保存到磁盘,则需要写入数据文件升级代码。

  2. 每个窗口数据通常使用GWL_USERDATA与窗口句柄一起存储。如果将某些数据扩展为32位,则偏移量将发生变化。

  3. POINT& Win32中SIZE结构为64位。在Win16中它们是32位并且可以作为DWORD返回(调用者将返回值分成两个16位值)。这在Win32中不再有效(即Win32不返回64位结果)并且函数已更改为接受指针以存储返回值。您需要编辑所有这些。像GetTextExtent这样的API会受此影响。同样的问题也适用于某些Windows消息。

  4. 在Win32中不鼓励使用INI文件,而是支持注册表。虽然INI文件功能仍然有效,但您需要小心Vista问题。 16位程序通常将其INI文件存储在Windows系统目录中。

  5. 这只是我记忆中的一些问题。自从我进行任何Win32移植以来已经过去了十多年。一旦你进入它,它很快。每个代码库在移植时都会有自己的“感觉”。你可能甚至会发现一些错误。

答案 2 :(得分:3)

MSDN上的文章Porting 16-Bit Code to 32-Bit Windows中有明确的指南。

答案 3 :(得分:1)

原来的win32 sdk有一个工具可以扫描需要更改的源代码和标记的行,但我记不起该工具的名称了。

过去我必须这样做时,我使用了蛮力技术 - 即: 1 - 更新makefile或构建环境以使用32位编译器和链接器。 (可选)只需在IDE中创建一个新项目(我使用Visual Studio),然后手动添加文件。

2 - 构建

3 - 修复错误

4 - 重复2& 3直到完成

流程的痛苦取决于您要迁移的应用程序。我在一小时内完成了10,000个线路节目,并在不到一周的时间内完成了75,000个线路节目。我也有一些小工具,我刚刚放弃并重新编写(大部分)从头开始。

答案 4 :(得分:0)

我同意艾伦的说法,试错可能是最好的方法。

以下是一些不错的tips

答案 5 :(得分:0)

同意编译器可能会捕获大部分错误。此外,如果您使用“near”和“far”指针,则可以删除这些指定 - 指针只是Win32中的指针。