代码之家  ›  专栏  ›  技术社区  ›  Zathrus

将win16 c代码转换为win32

  •  15
  • Zathrus  · 技术社区  · 17 年前

    一般来说,将16位Windows程序转换为Win32需要做什么?我确信我不是唯一继承代码库的人,当发现16位代码隐藏在角落时,我会大吃一惊。

    所讨论的代码是C。

    6 回复  |  直到 17 年前
        1
  •  15
  •   Benjamin Pollack Stefan Rusek    17 年前
    1. 意义 wParam lParam 在很多地方都发生了变化。我 强烈地 鼓励你偏执,尽可能地转换自己的想法。 message crackers . 它们能帮你减轻头痛。如果我能给你的建议只有一条,那就是它了。
    2. 只要您使用消息破解器,还可以启用 STRICT . 它将帮助您使用 int 它应该在哪里使用 HWND , HANDLE 或者别的什么。转换这些将大大有助于9在此列表中。
    3. hPrevInstance 是没用的。确保它没有被使用。
    4. 确保您使用的是Unicode友好调用。这并不意味着你需要把所有的东西 TCHAR S,但意味着你最好更换 OpenFile , _lopen _lcreat 具有 CreateFile ,举个明显的例子
    5. LibMain 现在是 DllMain 和整个库格式和导出约定不同
    6. Win16没有VMM。 GlobalAlloc , LocalAlloc , GlobalFree LocalFree 应该用更现代的替代品。完成后,清除 LocalLock , LocalUnlock 还有朋友,他们现在没用了。我不能想象你的应用程序会这么做,但要确保你不依赖 WM_COMPACTING 当你在那里的时候。
    7. Win16也没有内存保护。确保您没有使用 SendMessage PostMessage 向进程外窗口发送指针。您需要切换到更现代的IPC机制,例如管道或内存映射文件。
    8. Win16还缺乏先发制人的多任务处理。如果你想从另一个窗口得到一个快速的答案,那么打电话给我就太酷了 发送消息 等待消息被处理。现在这可能是个坏主意。考虑是否 发送消息 不是更好的选择。
    9. 指针和整数大小更改。请记住仔细检查您正在读或写数据到磁盘的任何地方,特别是如果它们是win16结构。您需要手动重做它们来处理较短的值。同样,解决这一问题最不痛苦的方法是尽可能使用消息破解器。否则,您需要手动搜索并转换 int DWORD 如适用,等等。
    10. 最后,当您确定了明显的问题后,考虑启用64位编译检查。从16到32位所面临的许多问题与从32到64的相同,而VisualC++现在是相当聪明的。不仅会遇到一些挥之不去的问题,还会为最终的Win64迁移做好准备。

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

        2
  •  6
  •   Mike Thompson    17 年前

    除了使构建环境正确,您还需要解决以下几个具体问题:

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

    2. 每个窗口的数据通常使用gwl_用户数据与窗口句柄一起存储。如果将某些数据扩展到32位,则偏移量将更改。

    3. 点大小结构在Win32中为64位。在Win16中,它们是32位的,可以作为一个dword返回(调用者将返回值拆分为两个16位值)。这不再适用于win32(即win32不返回64位结果),并且函数已更改为接受指针来存储返回值。您需要编辑所有这些内容。像gettexxtextent这样的API受此影响。同样的问题也适用于某些Windows消息。

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

    这只是我能回忆起的几个问题。自从我做过任何Win32移植以来已经有十多年了。一旦你进入它是相当快的。当涉及到移植时,每个代码库都会有自己的“感觉”,您将习惯它。一路上你可能会发现一些虫子。

        3
  •  3
  •   ChrisN    17 年前

    这篇文章有一个明确的指南 Porting 16-Bit Code to 32-Bit Windows 在MSDN上。

        4
  •  1
  •   Alan    17 年前

    最初的win32 sdk有一个工具,它扫描源代码并标记需要更改的行,但我记不起该工具的名称。

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

    2建造

    3固定错误

    4-重复2和3,直到完成

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

        5
  •  0
  •   Gordon Wilson    17 年前

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

    这里有一些好的 tips .

        6
  •  0
  •   jeffm    17 年前

    同意编译器可能会捕获大多数错误。此外,如果您使用的是“近”和“远”指针,则可以删除这些名称——指针只是Win32中的一个指针。

    推荐文章