Это похоже на ошибку, которая возникла, когда распространяемый Visual C ++ 2008 (msvcr90.dll) не был установлен в системе. Но сначала, пожалуйста, проверьте (с помощью Dependency Walker), что httpd.exe
и mod_wsgi.so
используют абсолютно одинаковые msvcr90.dll
:
- то же имя
- тот же каталог
- та же версия
- та же отметка времени
Если они используют разные имена DLL (например, msvcr90.dll
и msvcr100.dll
), тогда вы должны перекомпилировать оба с одним и тем же компилятором (например, Visual Studio 2008).
Если они используют одно и то же имя DLL, но разные версии или в разных каталогах, то у вас может быть та же проблема, что и у меня, с BitNami DjangoStack.
Поскольку msvcr90.dll
не был установлен в масштабе всей системы в C:\Windows\WinSxS
, httpd
вообще мог работать только из-за «развертывания xcopy» параллельной сборки в том же каталоге, что и httpd .exe:
Microsoft.VC90.CRT.manifest
msvcr90.dll
Если бы этих файлов не было, они бы не работали из-за отсутствующей зависимости от msvcr90.dll
или с этой ошибкой:
Это приложение не удалось запустить из-за неправильной конфигурации приложения. Переустановка приложения может решить эту проблему.
(т. Е. DLL была найдена, но без манифеста, чтобы сделать ее действительной).
Хотя httpd.exe
работает таким образом, он не может надежно загрузить DLL, которая также использует msvcr90.dll
:
- Если DLL имеет «развертывание xcopy» в своем собственном каталоге, тогда она загрузит другую копию DLL в процесс (потому что это другая копия DLL?). Это приводит к появлению второй кучи в пространстве памяти процесса, которая может привести к сбою процесса, если память передается между DLL и httpd (выделяется одним и освобождается другим). Я думаю, это то, что вы видите.
- Если DLL-библиотека не имеет «развертывание xcopy» в своем собственном каталоге, она не сможет загрузить ошибку SideBySide или Windows Error Reporting в системном журнале событий.
Вы можете узнать больше об этой проблеме на Python bug 4120 , хотя это не ясное, полное и окончательное объяснение проблемы, и я пока не смог найти ее.
Единственный надежный способ запустить этот стек - установить Visual C ++ 2008 распространяемый для всей системы, который помещает копию msvcr90.dll
в подкаталог C:\Windows\WinSxS
вместе с манифестом. чтобы заставить его работать.
Это должно (я думаю) заставить Windows полностью игнорировать файлы Microsoft.VC90.CRT.manifest
и msvcr90.dll
в каталогах приложений и DLL. Оба должны использовать одну и ту же DLL в C:\Windows\WinSxS
, и она должна быть загружена в процесс только один раз.