将Win16 C代码转换为Win32

Zat*_*rus 15 c windows winapi 16-bit

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

有问题的代码是C.

Ben*_*ack 15

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

编辑:正如@ChrisN指出的那样,将Win16应用程序移植到Win32的官方指南仍然可用,并且两者都充实并增加了我的观点.


Mik*_*son 6

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

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

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

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

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

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