1

你好!

我有一个旧插件(作为二进制文件,dll),由我的应用程序使用。它是为WM2003构建的。现在,如果在Windows Mobile 6.1上加载,它会使应用程序崩溃(WM5可以正常工作,WM6也可以)。

源代码不可用,开发人员不再支持它。所以我不能为WM6.1重建它。

是否可以修补或转换二进制文件以使其在WM6.1上工作?如果是这样,我该怎么做?

谢谢你。


编辑:我发现问题出在 PE loader中,它在 WM6.1 上的作用不同(与 WM6 及更早版本相比)。

4

2 回答 2

2

这个插件是使用MFC还是ATL?早期版本的 WinMo 内置了不同的 ATL/MFC 版本,因此在 Studio 中编写的 MFC 或 ATL 应用程序将无法运行,除非您将较新的 ATL/MFC 库与应用程序一起部署,就像旧应用程序无法在新设备上运行一样除非您部署旧的 MFC/ATL 库。

于 2010-02-06T01:07:58.153 回答
0

这个问题很少见,但可以找到一些信息。

常见的解决方案是在 VS2008 中重建二进制文件(TCPMP new VS2008 builds for WM6.1),但如果您没有源代码,这将无济于事。

我在 cegcc 邮件列表(Windows Mobile 6.1 上的 arm-wince-cegcc)中找到了问题解释和另一个解决方案。在Windows Mobile 6.1 中,内存管理方案发生了变化。

从Windows Mobile 2003Windows Mobile 6.0,这种插槽排列保持不变。然而,随着Windows Mobile 6.1的发布,事情发生了变化,以减少DLL压力并在设备管理器进程空间中提供帮助。

Windows Mobile 6.1中,设备管理器的堆栈不再分配在进程的槽中。相反,操作系统使用位于大内存区域顶部的插槽 59用于设备管理器线程堆栈。...

此问题的解决方法是在注册表中声明 DLL(告诉操作系统不要将其加载到高内存中)。

我不喜欢这种解决方法,所以我尝试找到一些二进制修补程序。并找到了它:)

它不是真正的修补程序,它是UPX - eXecutables的终极打包程序。但它完美地解决了问题。包含UPX的 DLL不会使应用程序崩溃并且运行良好。

于 2010-02-08T19:03:23.700 回答