Тема: Zinc FAQ
Показать сообщение отдельно
Старый 28.11.2007, 18:16
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 12  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
По умолчанию Zinc: Access violation at ...

Ошибка при запуске приложения

Иногда при разработке приложения на Zinc возникает такая ситуация, что приложение при запуске выдает ошибку
вида

Код:
"Access violation at address 7C93426D in module 'ntdll.dll. Read of address 003a0043."
и, соответственно, стартовать не хочет. возможны варианты, когда в сообщении об ошибке ntdll.dll не упоминается.
Данная проблема может возникнуть при попытке переноса приложение на другой компьютер простым копированием исполняемого файла, а так же при запуске с CD. И даже при переносе исполняемого файла в другую папку на той же машине, что я наблюдал сам.
На mdm-форуме эта прблема обсуждалась довольно долго.

http://www.mdmforum.com/forum/index.php?showtopic=13421

Кратко изложу суть обсуждения.
По непонятым причинам один и тот же .ехе файл нормально запускается на одной машине и отказывается
стартовать на другой. Речь шла именно о запуске с CD.
Эксперименты разработчиков показали, что возникновение ошибки происходит непредсказуемо.
Например, производились проверки на разных OC (семейства Windows), на разных аппаратных конфигурациях.
Никакой закономерности отследить не удалось и баг был помещен в WishList.
Тем не менее, было найдено несколько приемов устранения этой специфической ошибки.

1. Запуск в режиме совместимости с Win98.
2. Внесение изменений в реестр, таких, что программа принудительно стартует в режиме совместимости с Win98.
3. Сокращение имени исполняемого файла до 3-х - 4-х символов (или даже до 1-ого).

В моей практике эта неприятная ситуация возникала несколько раз.
Всякий раз сокращение имени файла мне помогало. Видимо, о чем свидетельствуют и сведения из указаного топика
на mdm-форуме, этот прием наиболее эффективен.
В целом у участников обсуждения сложилось мнение, что проблема возникает из-за внутренних политик безопасности
Windows XP. В чем конкретно состоит причина выяснить не удалось. Будем надеяться, что производители Zinc
смогут разрешить этот вопрос.

[добавлено]

М-да... сокращение имени файла не панацея, как оказалось.
После некоторого количества собственных экспериментов складывается такая картина.

1. "непредсказуемость" возникновения бага обусловлена на самом деле текущим сосотоянием профиля пользователя, который пытается приложение запустить. пересоздание профиля устраняет баг. где сидит затык в профиле до конца не выяснил, но установлено, что сидит он в той его части, которая хранится на компе, не выгружается на сервак (в случае использования сетвого входа). поэтому, на одних компах баг проявляется, на других может и не проявляться.
даже если установить точную причину затыка, вряд ли это будет иметь практическое значение, т.к. править профиль перед запуском все равно никто не будет.

2. баг с "хорошей" вероятностью возникает, если в Zinc IDE вручную указывать заголовок формы и приложения (поля Form Caption и Application title). Application title скорее приводит к ошибке. при этом "плохо" себя ведут символы вроде точки, пробела, русских букв, но не всегда, почему - смотри п.1. если задавать эти параметры программно, оставляя соответствующие поля в IDE пустыми, даже с использованием этих символов, баг не возникает.

3. баг не проявляется независимо от других факторов, если запускать приложение в режиме совместимости с Win98, Win2000.
это может оказаться полезным при создании собственного инсталлятора приложения (см. NSIS, Inno Setup из бесплатных). В алгоритме установки можно указать команду записи в реестр ХР соответствующего ключа типа
Код:
ключ:         HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
значение:   "D:\\Start.exe"="WIN98"
что и заставит приложение стартовать в режиме совместимости с указанной версией Windows.

4. судя по трэйсам, стоп с ошибкой происходит на стадии обращения к системной библиотеке ntdll.dll, которая подключается при запуске, как раз перед первой прорисовкой окна приложения.

Официальное описание проблемы

http://www.multidmedia.com/support/t...n=detail&id=19


Последний раз редактировалось alexcon314; 20.06.2008 в 14:39.