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 バージョンが組み込まれていたため、古いアプリが新しいデバイスで動作しないのと同様に、アプリと共に新しい ATL/MFC ライブラリを展開しない限り、Studio で記述された MFC または ATL アプリは動作しません。古い 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 2003からWindows Mobile 6.0までほぼ一定でした。ただし、Windows Mobile 6.1のリリースでは、 DLLのプレッシャーを軽減し、デバイス マネージャーのプロセス空間を支援するために変更が加えられました。

Windows Mobile 6.1では、デバイス マネージャーのスタックがプロセスのスロットに割り当てられなくなりました。代わりに、オペレーティング システムはデバイス マネージャ スレッド スタック用に、 Large Memory Areaの上部にあるスロット 59を使用します。...

この問題の回避策は、レジストリで DLL を宣言することです (OS にそれを高メモリにロードしないように指示します)。

私はこの回避策が気に入らないので、バイナリパッチャーを見つけようとしています。そしてそれを見つけました:)

これは実際にはパッチャーではなく、UPX (eXecutablesの究極のパッカー) です。しかし、それは問題を完全に解決します。UPXでパックされた DLL は、アプリケーションをクラッシュさせず、正常に動作します。

于 2010-02-08T19:03:23.700 に答える