Delphi программа и проблема совместимости с 64-битной Windows - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть несколько клиентов / кандидатов, которые жаловались, что моя программа не работает на их 64-битной версии Windows 7 (подтверждено скриншотами). Ошибки были странные, например:

в пробной версии я получать сообщение об ошибке всякий раз, когда я нажмите \ "пометить \" \ "удалить \" \ "помощь \".

Сообщение об ошибке: нарушение прав доступа при адрес 0046C978 в модуле \ 'ideduper.exe. \' читать адрес 00000004

Windows 7 Ultimate 64bit. i7 920 @ 2,67 ГГц 9 ГБ или оперативная память

'Mark', 'delete' и 'help' - это просто стандартные TToolButton на TToolbar.

В другом примере не удается получить эскиз от IExtractImage.

Я сказал им попробовать режим совместимости, но все равно не работает.

Проблема в том, что когда я тестировал его на Windows 7 HP 64-bit на моем компьютере (что я делал до того, как выпустил его на самом деле), он просто отлично работает! Так что я не знаю, что вызвало это

Есть ли у вас какие-либо рекомендации? По-разному ли Windows-пакет (home basic, premium, ultimate и т. Д.) Обрабатывает 32-битную прогу? Нужно ли ждать выхода 64-битного компилятора?

Заранее спасибо

Ответы [ 6 ]

10 голосов
/ 03 февраля 2011

На мой взгляд, лучше всего добавить MadExcept или EurekaLog или что-то похожее на ваше приложение и дать клиенту попробовать еще раз. MadExcept создаст журнал с трассировкой стека, который даст вам более четкое представление о том, что там происходит.

Чтобы ответить на 2-ю часть вопроса, 32-битные программы Delphi отлично работают на 64-битной Windows 7. Я думаю, что более вероятно, что у вас есть проблемы с управлением памятью, и клиент просто сталкивается с ними, а вы нет. Используйте FastMM4, чтобы отследить их.

3 голосов
/ 03 февраля 2011

Бесплатная альтернатива MadExcept - JCL Debug.Однако он менее тщательный и не содержит классного диалогового окна для отправки вам трассировки стека по электронной почте или в виде файла, который вы можете прикрепить и отправить по электронной почте вручную.

MadExcept стоит своих денегбесплатно для некоммерческого использования.Вы можете сначала попробовать его на своем ПК, проверить его функциональность и убедиться, что он работает так, как вам нужно, а затем купить его.

Если покупка Delphi того стоит (и она того стоит!), То покупка безумного Except - ежу понятно.Но если вы настаиваете на своем, JCLDebug (часть библиотеки кода jedi) также очень хорош.

3 голосов
/ 03 февраля 2011

Ваши приложения пытаются получить доступ к неверному указателю. Изменение окружающей среды может вызвать проблемы, которые скрыты в других. Проверьте свое приложение и используйте FastMM + JCL + JCVL / MadExcept / EurekaLog, чтобы получить подробное описание проблемы. Некоторые API-интерфейсы Windows могут иметь более строгие реквизиты вызовов до 7 и / или 64-разрядных, но мы должны знать, что на самом деле вызывает ваше приложение.

1 голос
/ 03 февраля 2011

Дайте им урезанную версию вашего приложения и посмотрите, когда проблема исчезнет. Держу пари, это ваш код, потому что у меня никогда не было проблем с моими (сотнями) клиентами W7 / 64.

0 голосов
/ 04 февраля 2011

В дополнение ко всем предыдущим предложениям я добавлю разницу в доступе к Реестру под WOW64 по сравнению с Win32. Если ваше приложение обращается к реестру для чтения или записи некоторых параметров, вы должны знать об этом. Сначала взгляните на эту и эту страницу в MSDN. На этой странице вы найдете 2 флага, которые определяют доступ к реестру из 32- или 64-битного приложения. KEY_WOW64_64KEY это тот, который вы должны использовать.

В любом случае, я согласен с другими в использовании madExcept (или любого другого подобного инструмента), чтобы найти точную причину ваших проблем.

0 голосов
/ 03 февраля 2011

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

Настройка по умолчанию (которая совместима с более старыми версиями Windows, такими как 95/98 / ME), позволяет программному обеспечению выполнять код из сегментов данных.Более строгие настройки не позволяют этого, и вместо этого возникает исключение системного уровня.

Вы можете проверить настройки между ними, посмотрев Свойства системы.Сейчас я не на машине с Win7, но на WinXP вы попадаете туда, щелкнув правой кнопкой мыши на «Мой компьютер», выбрав «Свойства», выбрав «Параметры производительности», а затем выбрав вкладку «Предотвращение выполнения данных».Найдите его в Vista / Win7 с помощью справки;поиск защиты выполнения данных.

Решение, как говорили предыдущие ответы, заключается в установке MadExcept или EurekaLog.Вы также можете получить бесплатную версию как часть JEDI , в JCLDebug IIRC.Я не использовал это, поэтому я не могу поручиться за это лично.Я слышал, что это довольно хорошо.

Если вы не хотите идти по этому пути, установите точку останова где-нибудь в части запуска вашего приложения (убедитесь, что сборка включена с включенной информацией отладки).Запускайте ваше приложение, пока не будет достигнута точка останова, а затем используйте IDE Search-> Goto Address (который отключен, пока не будет достигнута точка останова).Введите адрес из диалогового окна исключения (не тот, который является почти всеми нулями, а адрес 0046C978, с префиксом $, чтобы указать, что это в шестнадцатеричном виде), как в $ 0046C978.Вы, вероятно, окажетесь в окне ЦП, глядя на ассемблерный код, но обычно вы можете выбрать какую-то строку кода Delphi, которая иногда может дать вам место для начала поиска.

...