dll vbscript asp-classic com

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



vbscript asp-classic (1)

Hemos estado intentando 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 todo lo que puedo llegar.

No podemos hacer que las páginas servidas por IIS den algo más que un error 500.

Al rastrear la ASP:

127. -ASP_SCRIPT_TRACE_COM_CALL_END FilePath C:/INETPUB/WWWROOT/MILER/GLOBAL.ASA LineNumber 6 CurrentStatement set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer") SizeOfStatement 55 0 ms 128. -ASP_LOG_ERROR LineNumber 6 ErrorCode ASP 0177 : 8007007e Description Server.CreateObject Failed

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 tanto al uso de Server.CreateObject como a CreateObject en

vbscript jscript vba

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

¿Qué causa este error?

Server.CreateObject Failed

se produce con mayor frecuencia cuando las aplicaciones web se mueven de un servidor web a otro sin comprender 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 crear una instancia de un objeto que no está registrado en el sistema local.

Identificando 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 (por suerte, tiene un buen código de seguimiento, por lo que es aún mejor) .

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

Nota: Tenga cuidado al acceder al Registro de Windows, ya que es muy fácil realizar cambios inadvertidos que tienen consecuencias graves para el sistema operativo y, en casos extremos, requerirá la restauración o reinstalación / reparación del sistema.

La cadena dentro del método CreateObject se conoce como ProgId y se usa como un 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 regedit.exe también conocido como Editor del Registro. Tenga mucho cuidado al usar esta herramienta para explorar 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 comunicarse con el Registro de Windows y encontrar una clave correspondiente que indique la ubicación de la DLL accesible COM registrada.

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/CLSID

colmena se puede utilizar para encontrar la ubicación buscando en la subclave

HKEY_CLASSES_ROOT/CLSID/{GUID from CLSID}/InprocServer32

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

Ejemplo de uso del ProgId - Scripting.FileSystemObject

  1. Localice la subclave Scripting.FileSystemObject en HKEY_CLASSES_ROOT

    HKEY_CLASSES_ROOT/Scripting.FilesystemObject

  2. Identificar GUID de la subclave CLSID

    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/CLSID

    HKEY_CLASSES_ROOT/CLSID/{0D43FE01-F093-11CF-8940-00A0C9054228}

  4. Compruebe el valor de la subclave InprocServer32 (default) para la ubicación de la DLL

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

No 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 las dos razones que explicaremos 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 de COM se pueden registrar y crear las entradas de registro correspondientes 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, aunque la arquitectura 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 debe admitir una arquitectura de 64 bits más nueva y aún mantener el soporte para la arquitectura de 32 bits. La solución que surgió de Microsoft fue dividir el sistema operativo en dos, por lo que tenemos elementos de 64 bits y elementos de 32 bits. Los principales programas del sistema operativo se dividen en dos carpetas (solo en sistemas operativos 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 32 bits solamente, use las ubicaciones de 64 bits para los archivos del sistema y el registro de Windows.

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

  1. Para programas de 64 bits

    %SystemRoot%/System32/

  2. Para programas 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

Entonces, 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

A medida que todo comienza a admitir 64 bits, incluido IIS, aún debe poder admitir aplicaciones heredadas que solo admiten COM de 32 bits, por lo que IIS se introdujo en IIS 6.0 (a partir de Windows Server 2003, Service Pack 1) en la configuración del grupo de aplicaciones configurable Propiedad Enabled32BitAppOnWin64 que permite que el grupo de aplicaciones se ejecute en modo de 32 bits en las versiones de Windows de 64 bits.

Con esto en mente antes de registrar la DLL de COM para saber dónde debe registrarla, debe saber si el grupo de aplicaciones se ejecuta en modo de 32 bits. En IIS 7.0 y versiones posteriores, puede verificar esto 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 llama Enable 32-Bit Applications (también se puede configurar en applicationHost.config usando enable32BitAppOnWin64 en la sección <ApplicationPools> ) .

  • Si Enable 32-Bit Applications está establecido en False

    El grupo de aplicaciones IIS se ejecuta en modo nativo de 64 bits y cualquier DLL COM que deba ser utilizada por la aplicación web ASP deberá admitir 64 bits y registrarse con la versión de 64 bits de regsvr32.exe para agregarse a 64 bits registro.

    C:/Windows/System32>regsvr32 "C:/Windows/PCMSRV32.DLL"

  • Si Enable 32-Bit Applications está configurado en True

    El grupo de aplicaciones IIS se ejecuta en modo de 32 bits y cualquier DLL COM que deba ser utilizada por 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á al 32 Bit de registro.

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

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

Por ejemplo, usando

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

registrar la DLL COM con el registro de 32 bits en una versión de Windows de 64 bits cuando el grupo de aplicaciones IIS no está en modo de 32 bits, provocará el error del servidor interno ASP 500.100

Error de objeto del servidor ''ASP 0177: 8007007e''

Server.CreateObject Failed

Lista de comprobación de DLL COM

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

  2. ¿La DLL está registrada usando la versión específica de la arquitectura de regsvr32.exe (si la versión de Windows no es de 64 bits, use la predeterminada) que refleje 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 arquitectura 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 del registro?

Enlaces útiles