通常情况下,将一个16位的Windows程序转换为Win32需要做些什么?我相信我不是唯一一个继承代码库并惊讶地发现16位代码潜藏在角落里的人。
这个问题涉及到的代码是C语言编写的。
通常情况下,将一个16位的Windows程序转换为Win32需要做些什么?我相信我不是唯一一个继承代码库并惊讶地发现16位代码潜藏在角落里的人。
这个问题涉及到的代码是C语言编写的。
wParam
和lParam
的含义在许多地方都发生了改变。我强烈建议您要非常谨慎,尽可能地转换使用message crackers。它们将为您节省无数的头痛。如果我只能给你一个建议,那就是这个。STRICT
。它将帮助您捕获使用int
而不是HWND
、HANDLE
或其他东西的Win16代码库。转换这些将极大地有助于本列表中的第9点。hPrevInstance
是无用的。确保不要使用它。TCHAR
,但意味着您最好用CreateFile
替换OpenFile
、_lopen
和_lcreat
等明显的函数。LibMain
现在是DllMain
,整个库格式和导出约定都不同。GlobalAlloc
、LocalAlloc
、GlobalFree
和LocalFree
。完成后,清理对LocalLock
、LocalUnlock
等函数的调用;它们现在是无用的。虽然我想象不出您的应用程序会这样做,但请确保您不依赖于WM_COMPACTING
。SendMessage
或PostMessage
向进程外的窗口发送指针。您需要切换到更现代的IPC机制,如管道或内存映射文件。SendMessage
并等待消息被处理。现在可能是个坏主意。请考虑是否PostMessage
不是更好的选择。int
为DWORD
等。编辑: 正如@ChrisN指出的那样,将Win16应用程序移植到Win32的官方指南已经存档,且补充并扩展了我上面的观点。
包含整数的结构体需要更改为short或从16位扩展到32位。如果您更改了结构的大小,并且它被加载/保存到磁盘中,则需要编写数据文件升级代码。
每个窗口数据通常与窗口句柄一起使用GWL_USERDATA存储。如果您将一些数据扩展到32位,偏移量将发生变化。
在Win32中,POINT和SIZE结构为64位。在Win16中,它们为32位,并且可以作为DWORD返回(调用方会将返回值拆分为两个16位值)。这在Win32中不再适用(即Win32不返回64位结果),并且函数已更改为接受指针以存储返回值。您需要编辑所有这些内容。 GetTextExtent等API受此影响。此问题也适用于某些Windows消息。
在Win32中,不鼓励使用INI文件,而应使用注册表。虽然INI文件功能仍然有效,但您需要小心处理Vista问题。 16位程序经常将其INI文件存储在Windows系统目录中。
这只是我能想起的一些问题。自从我进行Win32移植以来已经过去了十多年。一旦您开始,它就会非常快速。每个代码库在移植方面都有其自己的“感觉”,您将习惯于此。您可能还会在途中发现一些错误。
原始的 win32 SDK 有一个工具,可以扫描源代码并标记需要更改的行,但我不记得工具的名称。
在过去必须这样做时,我使用了一种暴力技术 - 即: 1- 更新 makefiles 或构建环境以使用 32 位编译器和链接器。选择性地,在 IDE 中创建一个新项目(我使用 Visual Studio),并手动添加文件。
2- 构建
3- 修复错误
4- 重复步骤2和3,直到完成
这个过程的痛苦取决于您正在迁移的应用程序。我曾经在一个小时内转换了一万行程序,并在不到一周的时间内转换了七万五千行程序。我也遇到一些小型实用程序,我放弃了并重新编写了它们(主要是)从头开始。
同意编译器可能会捕捉到大部分错误。此外,如果您正在使用“near”和“far”指针,则可以删除这些标识 - 在Win32中,指针只是指针。