Ошибка 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 использовать в

VBScript JScript VBA

Разделы веб-сервера специфичны для 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

  1. разместить Scripting.FileSystemObject подключ в HKEY_CLASSES_ROOT

    HKEY_CLASSES_ROOT\Scripting.FilesystemObject
    
  2. Определить GUID из подраздела CLSID

    HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID
    
    (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"  
    
  3. Используйте GUID, чтобы найти зарегистрированный подключ DLL в HKEY_CLASSES_ROOT

    HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}
    
  4. Проверить подраздел InprocServer32(default) значение для местоположения DLL

    HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32
    
    (default) - "C:\Windows\System32\scrrun.dll"
    

нет ProgId за PCMServer.PCMServer в реестре?

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

  1. DLL не зарегистрирована.
  2. 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-битной ОС системные программы расположены в

  1. Для 64-битных программ

    %SystemRoot%\System32\
    
  2. Для 32-битных программ

    %SystemRoot%\SysWOW64\
    

Это также относится к реестру Windows

  1. 64 бит

    HKEY_CLASSES_ROOT
    
  2. 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 Контрольный список

  1. Что такое расширенная настройка пула приложений IIS Enable 32-Bit Applications установить, как это влияет на то, как вы регистрируете COM DLL?

  2. Зарегистрирована ли DLL-библиотека с использованием специфической для архитектуры версии regsvr32.exe (если версия Windows не 64-битная, используйте по умолчанию), которая отражает настройку Enable 32-Bit Applications?

  3. Реестр Windows содержит ProgId для DLL в архитектуре конкретного расположения

    HKEY_CLASSES_ROOT
    

    что отражает настройку Enable 32-Bit Applications?

  4. Ли InprocServer32 ключ содержит правильное местоположение для DLL?

  5. В контексте учетной записи, которую я использую для доступа к COM DLL (ApplicationIdentity, LocalSystem, NetworkService и т. Д.), Есть ли у меня разрешение на доступ как к физическому файлу DLL, так и к записям реестра?


Полезные ссылки

Другие вопросы по тегам