Ошибка ASP 0177: 8007007e Server.CreateObject не работает для COM DLL
Мы пытались установить COM DLL на новый сервер. Интерфейс Classic ASP. Кажется, проблема в DLL коннектора карты, но это насколько я могу получить.
Мы не можем заставить страницы, обслуживаемые IIS, выдавать что-либо, кроме ошибки 500.
При трассировке ASP:
127. -ASP_SCRIPT_TRACE_COM_CALL_END Путь файла C:\Inetpub \Wwwroot \ Милер \GLOBAL.ASA Номер строки 6 CurrentStatement set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer") SizeOfStatement 55 0 мс 128. -ASP_LOG_ERROR Номер строки 6 Код ошибки ASP 0177: 8007007e Описание Server.CreateObject Failed
DLL есть PCMSRV32.DLL
в c:\windows
GLOBAL.ASA:
Sub Application_OnStart
set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer")
set application("g_pcmsrv") = g_pcmsrv
set g_pcmmapmgr=Server.CreateObject("Pcmgole.PCMMapMgr")
set application("g_pcmmapmgr") = g_pcmmapmgr
End Sub
Sub Session_OnStart
set Session("currentTrip") = application("g_pcmsrv").NewTrip("NA")
set Session("map") = application("g_pcmmapmgr").createMap()
End Sub
Sub Session_OnEnd
set Session("currentTrip") = Nothing
set Session("map") = Nothing
End Sub
Sub Application_Onend
Set application("g_pcmsrv")=Nothing
Set application("g_pcmmapmgr")=Nothing
End Sub
1 ответ
Совет ниже относится как к Server.CreateObject
а также CreateObject
использовать в
Разделы веб-сервера специфичны для asp-classic, но все же стоит прочитать.
Что вызывает эту ошибку?
Server.CreateObject Failed
чаще всего вызывается, когда веб-приложения перемещаются с одного веб-сервера на другой без понимания внешних компонентов COM, которые используются и зарегистрированы на веб-сервере.
От PRB: Server.CreateObject возвращает ошибку HTTP 500.100 или ASP 0177 (0x8007007E)
Эта ошибка возникает при попытке использовать метод Server.CreateObject для создания экземпляра объекта, который не зарегистрирован в локальной системе.
Выявление источника ошибки
Если вы используете COM-компоненты внутри веб-приложения ASP, вы увидите следующую строку
set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer")
Обычно ошибка будет указывать на Set
строка, которая облегчает выявление причины (к счастью, у вас есть хороший код трассировки, так что это даже лучше).
Что делать, если вы не знаете, где находится DLL?
Примечание: пожалуйста, будьте осторожны при доступе к реестру Windows, так как очень легко непреднамеренно вносить изменения, которые имеют серьезные последствия для операционной системы, а в исключительных случаях потребуется восстановление или переустановка / восстановление системы.
Строка внутри CreateObject
метод известен как ProgId
и используется в качестве идентификатора ключа в реестре Windows, который можно найти внутри
Примечание. Реестр Windows можно просматривать в большинстве версий Windows, используя
regedit.exe
также известный как редактор реестра. Будьте очень осторожны при использовании этого инструмента для просмотра реестра Windows.
HKEY_CLASSES_ROOT
и, соответственно,
HKEY_LOCAL_MACHINE\Classes
Всякий раз, когда процессор ASP сталкивается с ProgId
он пытается связаться с реестром Windows и найти соответствующий ключ, который обозначает местоположение зарегистрированной доступной COM библиотеки DLL.
HKEY_CLASSES_ROOT\PCMServer.PCMServer
Общий подход к этому - ключ содержит подраздел с именем CLSID
который указывает на GUID класса для связанной зарегистрированной DLL. Как только ключ GUID находится в
HKEY_CLASSES_ROOT
Улей он может быть использован, чтобы найти место, посмотрев в подразделе
HKEY_CLASSES_ROOT\{GUID from CLSID}\InprocServer32
где место будет храниться в (default)
значение.
Пример использования
ProgId
-Scripting.FileSystemObject
разместить
Scripting.FileSystemObject
подключ вHKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT\Scripting.FilesystemObject
Определить GUID из подраздела
CLSID
HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"
Используйте GUID, чтобы найти зарегистрированный подключ DLL в
HKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}
Проверить подраздел
InprocServer32
(default)
значение для местоположения DLLHKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32 (default) - "C:\Windows\System32\scrrun.dll"
нет ProgId
за PCMServer.PCMServer
в реестре?
Если вы не можете найти соответствующий ProgId
в реестре это, скорее всего, связано с одной из двух причин, которые мы здесь уточним.
- DLL не зарегистрирована.
- DLL зарегистрирована в неправильной области.
Как зарегистрировать COM DLL в Windows
COM DLL могут быть зарегистрированы и иметь соответствующие записи реестра, созданные путем запуска regsvr32.exe
инструмент из командной строки Windows с использованием повышенных разрешений (это зависит от версии Windows).
Прежде чем продолжить, хотя архитектура операционной системы и режим, используемый веб-приложением ASP, очень важны.
Самое новое аппаратное обеспечение является 64-разрядным, что создает загадку в Windows, поскольку теперь оно должно поддерживать более новую 64-разрядную архитектуру и при этом поддерживать 32-разрядную архитектуру. Решение, которое разработала Microsoft, состояло в том, чтобы разделить ОС на две части, поэтому у нас есть 64-битные элементы и 32-битные элементы. Основные программы ОС разбиты на две папки (только в 64-битной ОС, поскольку 32-битная ОС не должна конкурировать с 64-битной, даже если оборудование способно на это).
Примечание. В 32-разрядных системах достаточно использовать 64-разрядные расположения как для системных файлов, так и для реестра Windows.
На 64-битной ОС системные программы расположены в
Для 64-битных программ
%SystemRoot%\System32\
Для 32-битных программ
%SystemRoot%\SysWOW64\
Это также относится к реестру Windows
64 бит
HKEY_CLASSES_ROOT
32 бит
HKEY_CLASSES_ROOT\Wow6432Node
Так, например, в 64-битной версии Windows следующая команда зарегистрирует PCMSRV32.DLL
в 32-битном реестре и создайте связанные ключи реестра COM DLL.
C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL"
Пул приложений IIS
Поскольку все начинает поддерживать 64-битную версию, включая IIS, вам все еще необходимо поддерживать устаревшие приложения, которые поддерживают только 32-битную COM, поэтому IIS, представленный в IIS 6.0 (начиная с Windows Server 2003, с пакетом обновления 1) в настройках пула приложений, настраивается имущество Enabled32BitAppOnWin64
который позволяет пулу приложений работать в 32-битном режиме в 64-битных версиях Windows.
Имея это в виду, прежде чем регистрировать COM DLL, чтобы знать, где вы должны ее регистрировать, вам нужно знать, работает ли пул приложений в 32-битном режиме. В IIS 7.0 и выше вы можете просто проверить это в свойствах пула приложений в приложении IIS Manager. Настройка находится в Advanced Settings
под General
раздел и называется Enable 32-Bit Applications
(также можно настроить в applicationHost.config
с помощью enable32BitAppOnWin64
под <ApplicationPools>
раздел).
Если
Enable 32-Bit Applications
установлен вFalse
Пул приложений IIS работает в собственном 64-битном режиме, и любые COM-библиотеки DLL, которые должны использоваться веб-приложением ASP, должны поддерживать 64-битную версию и регистрироваться с использованием 64-битной версии.
regsvr32.exe
быть добавленным в 64-битный реестр.C:\Windows\System32>regsvr32 "C:\Windows\PCMSRV32.DLL"
Если
Enable 32-Bit Applications
установлен вTrue
Пул приложений IIS работает в 32-разрядном режиме, и любые COM-библиотеки DLL, которые должны использоваться веб-приложением ASP, должны быть 32-разрядными библиотеками COM и должны быть зарегистрированы с использованием 32-разрядной версии.
regsvr32.exe
быть добавленным в 32-битный реестр.C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL"
Регистрация COM DLL с использованием неправильной версии regsvr32.exe
Например, используя
C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL"
регистрация COM DLL в 32-битном реестре в 64-битной версии Windows, когда пул приложений IIS не в 32-битном режиме, вызывает ASP 500.100
Внутренняя ошибка сервера
Ошибка объекта сервера "ASP 0177: 8007007e"
Server.CreateObject Failed
COM DLL Контрольный список
Что такое расширенная настройка пула приложений IIS
Enable 32-Bit Applications
установить, как это влияет на то, как вы регистрируете COM DLL?Зарегистрирована ли DLL-библиотека с использованием специфической для архитектуры версии
regsvr32.exe
(если версия Windows не 64-битная, используйте по умолчанию), которая отражает настройкуEnable 32-Bit Applications
?Реестр Windows содержит
ProgId
для DLL в архитектуре конкретного расположенияHKEY_CLASSES_ROOT
что отражает настройку
Enable 32-Bit Applications
?Ли
InprocServer32
ключ содержит правильное местоположение для DLL?В контексте учетной записи, которую я использую для доступа к COM DLL (ApplicationIdentity, LocalSystem, NetworkService и т. Д.), Есть ли у меня разрешение на доступ как к физическому файлу DLL, так и к записям реестра?
Полезные ссылки
- PRB: Server.CreateObject возвращает ошибку HTTP 500.100 или ASP 0177 (0x8007007E) (извините, ссылка больше не работает, поскольку Microsoft полностью уничтожила статью базы знаний, даже не может найти ее с помощью archive.org).