【问题标题】:Converting Win16 C code to Win32将 Win16 C 代码转换为 Win32
【发布时间】:2010-09-13 22:11:38
【问题描述】:

一般情况下,将 16 位 Windows 程序转换为 Win32 需要做什么?我敢肯定,我不是唯一一个继承代码库并惊讶地发现潜伏在角落里的 16 位代码的人。

有问题的代码是 C。

【问题讨论】:

  • 这是什么应用程序?
  • 我在我们的代码库中找到了几个;大多数是具有简单 GUI 的模拟器。关键的一个是用于与嵌入式设备交谈的串行通信。它还有一个 GUI。
  • 哇...我为你感到非常非常抱歉...作为我自己不得不处理纯 C 的 Win32 API 代码并试图将自己哭到遗忘,至少,我认为这可能是一个更糟... :-/

标签: c windows winapi 16-bit


【解决方案1】:
  1. wParamlParam 的含义在很多地方发生了变化。我强烈鼓励你保持偏执,尽可能多地使用message crackers。它们将为您省去无穷无尽的头痛。如果我只能给你一条建议,那就是它。
  2. 只要您使用消息破解程序,也请启用STRICT。它将帮助您使用 int 捕获 Win16 代码库,它应该使用 HWNDHANDLE 或其他东西。转换这些将大大有助于此列表中的第 9 位。
  3. hPrevInstance 没用。确保它没有被使用。
  4. 确保您使用的是 Unicode 友好的调用。这并不意味着您需要将所有内容都转换为TCHARs,而是意味着您最好将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 迁移做好准备。

编辑:正如@ChrisN 指出的那样,the official guide for porting Win16 apps to Win32 已存档,两者都充实并补充了我的上述观点。

【讨论】:

    【解决方案2】:

    除了让您的构建环境正确之外,您还需要解决以下几个细节问题:

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

    2. 每个窗口的数据通常使用 GWL_USERDATA 与窗口句柄一起存储。如果你将一些数据扩大到 32 位,你的偏移量将会改变。

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

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

    这只是我能回忆起的几个问题。自从我进行任何 Win32 移植以来已经有十多年了。一旦你进入它,它非常快。当涉及到您将习惯的移植时,每个代码库都会有自己的“感觉”。您甚至可能会在此过程中发现一些错误。

    【讨论】:

      【解决方案3】:

      在 MSDN 上的文章 Porting 16-Bit Code to 32-Bit Windows 中有一个权威指南。

      【讨论】:

        【解决方案4】:

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

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

        2 - 构建

        3 - 修复错误

        4 - 重复 2&3 直到完成

        该过程的痛苦取决于您要迁移的应用程序。我在一小时内转换了 10,000 个线路程序,在不到一周的时间内转换了 75,000 个线路程序。我也有一些我刚刚放弃并从头开始重写(大部分)的小实用程序。

        【讨论】:

          【解决方案5】:

          我同意 Alan 的观点,即反复试验可能是最好的方法。

          这里有一些不错的tips

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-25
              • 1970-01-01
              • 1970-01-01
              • 2010-09-17
              • 1970-01-01
              • 2014-09-16
              相关资源
              最近更新 更多