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
Localice la subclave
Scripting.FileSystemObject
enHKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT/Scripting.FilesystemObject
Identificar GUID de la subclave
CLSID
HKEY_CLASSES_ROOT/Scripting.FilesystemObject/CLSID (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"
Use GUID para encontrar la subclave DLL registrada en
HKEY_CLASSES_ROOT/CLSID
HKEY_CLASSES_ROOT/CLSID/{0D43FE01-F093-11CF-8940-00A0C9054228}
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í.
- La DLL no está registrada.
- 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
-
Para programas de 64 bits
%SystemRoot%/System32/
-
Para programas de 32 bits
%SystemRoot%/SysWOW64/
Esto también se aplica al Registro de Windows
-
64 bits
HKEY_CLASSES_ROOT
-
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 enFalse
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 enTrue
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
-
¿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? -
¿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 deEnable 32-Bit Applications
? -
¿El Registro de Windows contiene un
ProgId
para la DLL en la ubicación específica de la arquitectura deHKEY_CLASSES_ROOT
que refleja la configuración de
Enable 32-Bit Applications
? -
¿
InprocServer32
claveInprocServer32
contiene la ubicación correcta para la DLL? -
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?