Почему мое приложение дает сбой в Win XP, если я не установил среду выполнения VS2005?

Я пытаюсь выяснить, почему мое приложение, написанное на VC 2008, дает сбой на голой Windows XP с c0000005. Он отлично работает на любой Windows Vista и 7. В XP он вылетал без дополнительной информации. Ниже приведены подробности и результат нескольких дней моих головных болей, устранение одной причины за другой. Вот подробности:

  • У меня Win7 Ultimate с XP Mode с iexplore 6 и, по-видимому, без каких-либо патчей.

  • Я устанавливаю свою программу и ничего больше, так как предполагается, что она предназначена для установки и запуска без дополнительных пакетов.

  • Мое приложение скомпилировано во время выполнения VC2008 (с использованием параметра / MT, а не переключателя компилятора / MD)

  • Я использую встроенный firebird, которому нужны библиотеки VC2005 (отредактировано, я писал ранее VC2008), поэтому я помещаю их в рабочий каталог своего приложения.

  • когда я устанавливаю VC ++ 2008 на этот компьютер с XP Mode, он больше не дает сбоев, поэтому отладка таким способом невозможна

  • Я сузил частоту появления этой ошибки до среды выполнения VC2005 - сразу после установки мое приложение перестает давать сбой. Но я не знаю, что может использовать его компоненты. При запуске релизной версии под VC2008 IDE ничего не показывает загруженные библиотеки vc2005 (странно, если я так говорю).

Зависимости компоновщика моего приложения перечисляют их (я добавил только первые два, остальные предоставлены VisualStudio): jpeg.lib, gdiplus.lib, kernel32.lib, user32.lib, gdi32.lib, winspool.lib, comdlg32.lib , advapi32.lib, shell32.lib, ole32.lib, oleaut32.lib, uuid.lib, odbc32.lib, odbccp32.lib, comctl32.lib,% (AdditionalDependencies)

Я также использую интерфейс IBPP firebird, который загружает их динамически, поэтому они присутствуют в каталоге моего приложения (им нужны файлы msvc? 80.dll): fbembed.dll, ib_util.dll, icudt30.dll, icuin30.dll, icuuc30.dll , msvcp80.dll, msvcr80.dll

Пожалуйста, посоветуйте, почему среда выполнения vc2005 может помочь моему приложению не дать сбой на голой Win XP. Или как я могу отладить его, не устанавливая vc 2008 на целевой машине. Начинаю винить компоненты windows xp. В конечном итоге я хочу, чтобы мое приложение не требовало никаких дополнительных пакетов, таких как VC2008 или 2005, особенно когда ни один компонент моего приложения не требует последнего.


person Kitet    schedule 06.11.2011    source источник


Ответы (1)


Я также использую интерфейс IBPP firebird ... msvcp80.dll, msvcr80.dll

Ответ в вашем вопросе, эти DLL являются библиотеками DLL поддержки времени выполнения VS2005. Они не могут храниться в вашем каталоге exe, они должны быть зарегистрированы в параллельном кеше. Обычно это не вызывает AV, но это возможно, если код не проверяет возвращаемое значение LoadLibrary (). Вы можете загрузить для них установщик от Microsoft. В остальном это не имеет ничего общего с Windows XP, вы просто случайно пытались запустить эту программу на машинах, на которых уже были установлены библиотеки DLL. Например, очень часто встречается на машине разработчика.

Если вам не нужна зависимость от них, вам придется перестроить те библиотеки DLL, которые этого требуют. Это хорошая идея, поскольку зависимость от более чем одной версии CRT довольно нездорова.

Если вам интересно, почему вы столкнулись с этим: это была попытка Microsoft поставить DLL Hell в руки разработчика, а не пользователя. С тех пор они отозвали это, VS2010 снова создает проблему для пользователей. Я полагаю, это была довольно большая вечеринка в Бангалоре.

person Hans Passant    schedule 06.11.2011
comment
Спасибо за Ваш ответ. Пожалуйста, расскажите подробнее об этом нездоровье, о котором вы пишете - в одном из моих проектов я использую как oracle OCI, созданный с помощью VC2008, так и библиотеки firebird, созданные с помощью VC2005. (Между прочим, эти две библиотеки VC2005 включены вместе с некоторым манифестом во встроенный пакет Firebird, технически это не я поместил их в свой каталог exe). Должен ли я понимать, что мне следует заботиться о том, как создаются библиотеки DLL, используемые различными поставщиками баз данных? Ничего не могу с этим поделать, и я действительно не хочу перестраивать их клиентские dll ... Что самое худшее, что может случиться в этой ситуации? - person Kitet; 08.11.2011
comment
Сбой или утечка памяти. Как функция api, возвращающая std :: string. Размещено в одном ЭЛТ, выпущено в другом. Это халтура или утечка, в зависимости от версии Windows. Разработка API, в котором нет этой проблемы, должна выполняться с осторожностью. Основное правило заключается в том, что он не может выделять объекты или память, которые должны быть удалены или освобождены вызывающей стороной. - person Hans Passant; 08.11.2011