Как использовать двоичный файл (dll) WM2003 на устройстве Windows Mobile 6.1 (WM6.1)? (PE-загрузчик не принимает старые двоичные файлы)

Привет!

У меня есть старый плагин (как бинарный, dll), используемый моим приложением. Он был построен для WM2003. А теперь вылетает приложение, если оно загружено на Windows Mobile 6.1 (WM5 работает нормально, WM6 тоже).

Исходный код недоступен и больше не поддерживается разработчиком. Поэтому я не могу пересобрать его для WM6.1.

Можно ли исправить или преобразовать двоичный файл, чтобы он работал на WM6.1? Если да, то как я могу это сделать?

Спасибо.


Изменить: я обнаружил, что Проблема в PE-загрузчике, который на WM6.1 работает не так (по сравнению с WM6 и ранее).


person zxcat    schedule 05.02.2010    source источник


Ответы (2)


Этот плагин использует MFC или ATL? В более ранних версиях WinMo была встроена другая версия ATL / MFC, поэтому приложения MFC или ATL, написанные в Studio, не будут работать, если вы не развернете новые библиотеки ATL / MFC вместе с приложением, так же как старые приложения не будут работать на новых устройствах. если вы не развернете старые библиотеки MFC / ATL.

person ctacke    schedule 06.02.2010
comment
Спасибо за ответ. Нет, это чистый C-модуль. Похоже, проблема в PE-загрузчике. - person zxcat; 06.02.2010
comment
Какой инструмент вы используете для создания двоичных файлов? Я никогда не сталкивался с этой проблемой, и я запускал вещи, скомпилированные с помощью старой версии 3.0 tools user 6.x. - person ctacke; 07.02.2010
comment
Это мне не нравится. Разработчик DLL больше не доступен. Похоже, это был компилятор arm MSVS 2003. - person zxcat; 09.02.2010

Эта проблема возникает редко, но кое-какую информацию можно найти.

Распространенное решение - перестроить двоичный файл в VS2008 (TCPMP новые сборки VS2008 для WM6. 1), но это не поможет, если у вас нет исходного кода.

Я нашел объяснение проблемы и другое решение в списке рассылки cegcc (arm-wince-cegcc в Windows Mobile 6.1). В Windows Mobile 6.1 Memory Management была изменена схема управления памятью.

Расположение слотов оставалось неизменным от Windows Mobile 2003 до Windows Mobile 6.0. Однако с выпуском Windows Mobile 6.1 кое-что было изменено, чтобы уменьшить нагрузку на DLL и помочь в области процессов Диспетчера устройств.

В Windows Mobile 6.1 стеки для диспетчера устройств больше не выделяются в слоте процессов. Вместо этого операционная система использует слот 59 в верхней части большой области памяти для стеков потоков диспетчера устройств. ...

И решение этой проблемы - объявить DLL в реестре (чтобы ОС не загружала ее в верхнюю память).

Мне не нравится этот обходной путь, поэтому я пытаюсь найти какой-нибудь двоичный патчер. И нашел :)

Это не совсем патчер, это UPX - Ultimate Packer для eXecutables. Но решает проблему отлично. DLL, упакованная с помощью UPX, не вызывает сбоев приложения и работает нормально.

person zxcat    schedule 08.02.2010