Error ASP 0177: 8007007e Server.CreateObject falla para COM DLL

Hemos estado tratando de instalar una DLL COM en un nuevo servidor. La interfaz es ASP clásica. El DLL de Map Connector parece ser el problema, pero eso es lo más que puedo obtener.

No podemos hacer que las páginas servidas por IIS den cualquier error que no sea 500.

Al rastrear el ASP:

 127. -ASP_SCRIPT_TRACE_COM_CALL_END 


 Ruta de archivo
 C: \ INETPUB \ WWWROOT \ MILER \ GLOBAL.ASA 

 Número de línea
 6 

 Estado de cuenta actual
 establecer g_pcmsrv = Server.CreateObject ("PCMServer.PCMServer") 

 SizeOfStatement
 55 


 0 ms


 128. -ASP_LOG_ERROR 


 Número de línea
 6 

 Código de error
 ASP 0177: 8007007e 

 Descripción
 Server.CreateObject Falló

La DLL es PCMSRV32.DLL en 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 

El siguiente consejo se refiere a los Server.CreateObject y CreateObject en

vbscript jscript vba

Las secciones de Servidor web son específicas de asp-classic, pero aún así vale la pena leerlas.


¿Qué causa este error?

Server.CreateObject Falló

se produce con mayor frecuencia cuando las aplicaciones web se mueven de un servidor web a otro sin una comprensión de los componentes COM externos que están en uso y registrados en el servidor web.

Desde PRB: Server.CreateObject devuelve HTTP 500.100 o ASP 0177 Error (0x8007007E)

Este error se produce cuando intenta utilizar el método Server.CreateObject para instanciar un objeto que no está registrado en el sistema local.

Identificación de la fuente del error

Si está utilizando componentes COM dentro de una aplicación web ASP, verá una línea como esta

 set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer") 

Por lo general, el error apuntará a la línea Set , lo que facilita la identificación de la causa (afortunadamente tiene algún buen código de seguimiento en su lugar, por lo que es incluso mejor) .

¿Qué sucede si no sabe dónde se encuentra el archivo DLL?

Nota: Tenga cuidado al acceder al Registro de Windows, ya que es mucho más fácil realizar cambios inadvertidamente que tengan graves consecuencias para el sistema operativo y, en casos extremos, requerirá una restauración o reinstalación / reparación del sistema.

La cadena dentro del método CreateObject se conoce como ProgId y se usa como identificador de una clave dentro del Registro de Windows que se puede encontrar dentro del

Nota: El Registro de Windows se puede examinar en la mayoría de las versiones de Windows utilizando el regedit.exe también conocido como el Editor del Registro. Tenga mucho cuidado al usar esta herramienta para navegar por el Registro de Windows.

 HKEY_CLASSES_ROOT 

y por extensión

 HKEY_LOCAL_MACHINE\Classes 

Cada vez que el procesador ASP encuentra un ProgId intenta hablar con el Registro de Windows y encuentra una clave correspondiente que denota la ubicación de la DLL accesible COM accesible.

 HKEY_CLASSES_ROOT\PCMServer.PCMServer 

Un enfoque común para esto es que la clave contiene una subclave llamada CLSID que apunta al GUID de clase para la DLL registrada asociada. Una vez que la clave GUID se encuentra en el

 HKEY_CLASSES_ROOT 

hive se puede utilizar para encontrar la ubicación mirando en la subclave

 HKEY_CLASSES_ROOT\{GUID from CLSID}\InprocServer32 

donde la ubicación se almacenará en el (default) .

Ejemplo de uso del ProgIdScripting.FileSystemObject

  1. Busque la subclave Scripting.FileSystemObject en HKEY_CLASSES_ROOT

     HKEY_CLASSES_ROOT\Scripting.FilesystemObject 
  2. Identificar GUID desde CLSID subclave

     HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}" 
  3. Use GUID para encontrar la subclave DLL registrada en HKEY_CLASSES_ROOT

     HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228} 
  4. Compruebe el valor InprocServer32 (default) para la ubicación de la DLL

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

¿No ProgId ningún ProgId para PCMServer.PCMServer en el Registro?

Si no puede encontrar el ProgId correspondiente en el registro, es probable que se deba a una de dos razones que desarrollaremos aquí.

  1. La DLL no está registrada.
  2. La DLL está registrada en el área incorrecta.

Cómo registrar DLL COM con Windows

Las DLL COM se pueden registrar y tienen las entradas de registro correspondientes creadas ejecutando la herramienta regsvr32.exe desde el símbolo del sistema de Windows utilizando permisos elevados (esto varía de una versión a otra de Windows) .

Antes de continuar, la architecture del sistema operativo y el modo utilizado por la aplicación web ASP son muy importantes.

La mayoría del hardware más nuevo es de 64 bits. Esto crea un enigma en Windows, ya que ahora tiene que soportar una architecture más nueva de 64 bits y aún así mantener el soporte para la architecture de 32 bits. La solución que se le ocurrió a Microsoft fue dividir el sistema operativo en dos, por lo que tenemos elementos de 64 bits y elementos de 32 bits. Los principales progtwigs del sistema operativo se dividen en dos carpetas (solo en el sistema operativo de 64 bits porque un sistema operativo de 32 bits no tiene que lidiar con 64 bits, incluso si el hardware es capaz de hacerlo) .

Nota: en los sistemas de solo 32 bits, solo use las ubicaciones de 64 bits tanto para los archivos del sistema como para el registro de Windows.

En un sistema operativo de 64 bits, los progtwigs del sistema se encuentran en

  1. Para progtwigs de 64 bits

     %SystemRoot%\System32\ 
  2. Para progtwigs de 32 bits

     %SystemRoot%\SysWOW64\ 

Esto también se aplica al Registro de Windows

  1. 64 bits

     HKEY_CLASSES_ROOT 
  2. 32 bits

     HKEY_CLASSES_ROOT\Wow6432Node 

Por ejemplo, en una versión de Windows de 64 bits, el siguiente comando registrará PCMSRV32.DLL en el registro de 32 bits y creará las claves de registro COM DLL asociadas.

 C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL" 

Grupo de aplicaciones IIS

Como todo comienza a admitir 64 Bit, incluido IIS, aún necesita poder admitir aplicaciones heredadas que solo admitan 32 bits COM, por lo que IIS presentó en IIS 6.0 (comenzando con Windows Server 2003, Service Pack 1) bajo la configuración del Pool de aplicaciones lo configurable propiedad Enabled32BitAppOnWin64 que permite que el grupo de aplicaciones se ejecute en modo de 32 bits en las versiones de 64 bits de Windows.

Con esto en mente antes de registrar el DLL COM para saber dónde debe registrarlo, necesita saber si el grupo de aplicaciones se está ejecutando en el modo de 32 bits. En IIS 7.0 y superior, puede verificarlo desde las propiedades del grupo de aplicaciones dentro de la aplicación IIS Manager. La configuración se encuentra en la Advanced Settings en la sección General y se denomina Enable 32-Bit Applications (también se puede configurar en applicationHost.config usando enable32BitAppOnWin64 en la sección ) .

  • Si Enable 32-Bit Applications está configurado como False

    El grupo de aplicaciones de IIS se ejecuta en modo nativo de 64 bits y cualquier archivo DLL COM que necesite utilizar la aplicación web ASP deberá ser compatible con 64 bits y registrarse con la versión de 64 bits de regsvr32.exe que se agregará a la versión de 64 bits. registro.

     C:\Windows\System32>regsvr32 "C:\Windows\PCMSRV32.DLL" 
  • Si Enable 32-Bit Applications está configurado en True

    El grupo de aplicaciones de IIS se ejecuta en el modo de 32 bits y cualquier archivo DLL COM que necesite utilizar la aplicación web ASP deberá ser un archivo DLL COM de 32 bits y registrarse con la versión de 32 bits de regsvr32.exe que se agregará a la 32 Registro de bit

     C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL" 

Registrar el DLL COM utilizando la versión incorrecta de regsvr32.exe

Por ejemplo usando

 C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL" 

registrar el DLL COM con el registro de 32 Bits en una versión de 64 Bits de Windows cuando el Grupo de aplicaciones IIS no está en modo de 32 Bits causará el error del servidor interno ASP 500.100

Error de objeto de servidor ‘ASP 0177: 8007007e’

Server.CreateObject Falló


Lista de comprobación DLL COM

  1. ¿En qué configuración avanzada del conjunto de aplicaciones de IIS se Enable 32-Bit Applications , ya que afecta la forma en que se registra la DLL COM?

  2. ¿La DLL está registrada utilizando la versión específica de la architecture de regsvr32.exe (si la versión de Windows no usa 64 Bit por defecto) que refleja la configuración de Enable 32-Bit Applications ?

  3. ¿El Registro de Windows contiene un ProgId para la DLL en la ubicación específica de la architecture de

     HKEY_CLASSES_ROOT 

    que refleja la configuración de Enable 32-Bit Applications ?

  4. ¿ InprocServer32 clave InprocServer32 contiene la ubicación correcta para la DLL?

  5. En el contexto de la cuenta que estoy usando para acceder a la DLL COM (ApplicationIdentity, LocalSystem, NetworkService, etc.) , ¿tengo permiso para acceder tanto al archivo DLL físico como a las entradas de registro?


Enlaces útiles

  • PRB: Server.CreateObject devuelve el error HTTP 500.100 o ASP 0177 (0x8007007E) (El enlace Sorry ya no funciona, ya que Microsoft ha destruido por completo el artículo de la base de conocimiento por completo, ni siquiera puede localizarlo usando archive.org) .