错误ASP 0177:8007007e COM DLL的Server.CreateObject失败 [英] Error ASP 0177: 8007007e Server.CreateObject fails for COM DLL
问题描述
我们一直在尝试在新服务器上安装COM DLL。接口是Classic ASP。地图连接器DLL似乎是问题,但这是我能够得到。
我们无法获得IIS提供的页面给任何其他
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
说明
Server.CreateObject失败
DLL
GLOBAL.ASA:
/ p> 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
设置会话(currentTrip)=应用程序(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
设置应用程序(g_pcmsrv)=无
设置应用程序(g_pcmmapmgr) = Nothing
End Sub
错误?
Server.CreateObject失败
最常见的情况是当Web应用程序从一个Web服务器移动到另一个Web服务器时,没有了解正在使用并向Web服务器注册的外部COM组件。
从 PRB:Server.CreateObject返回HTTP 500.100或ASP 0177错误(0x8007007E)
当您尝试使用 Server.CreateObject
识别错误来源
如果在ASP Web应用程序中使用COM组件,您将看到类似下面的行:
< pre class =lang-vb prettyprint-override>
set g_pcmsrv = Server.CreateObject(PCMServer.PCMServer)
通常,错误会指向 Set
行,这使得识别原因更容易[幸运的是你有一些不错的跟踪代码
如果您不知道DLL位于何处,该怎么办?
$ b $注意:请在访问Windows注册表时小心,因为这样会更容易无意中对操作系统造成严重后果,在极端情况下需要系统还原或重新安装/修复。
CreateObject
方法称为 ProgId
,并且用作Windows注册表中可以在
$ b中找到的密钥的标识符$ b
注意: Windows注册表可以在大多数版本的Windows中使用
regedit.exe
称为注册表编辑器。使用此工具浏览Windows注册表时非常小心。
HKEY_CLASSES_ROOT
并按分机
HKEY_LOCAL_MACHINE\Classes
ASP处理器遇到 ProgId
它尝试与Windows注册表通信并找到表示注册的COM可访问DLL的位置的对应键。
HKEY_CLASSES_ROOT\PCMServer.PCMServer
一个常见的方法是,键包含一个名为 CLSID
的子键,它指向相关联的注册DLL的类GUID。一旦GUID键位于
HKEY_CLASSES_ROOT
hive可以通过查看子项
来查找位置
HKEY_CLASSES_ROOT\ {来自CLSID的GUID} \InprocServer32
其中位置将存储在
(默认)
值中。
示例使用
ProgId
-Scripting.FileSystemObject
在
HKEY_CLASSES_ROOT中找到
Scripting.FileSystemObject
子项HKEY_CLASSES_ROOT\Scripting.FilesystemObject
从子项
中识别GUIDCLSID
HKEY_CLASSES_ROOT\Scripting.FilesystemObject \CLSID
(默认值) - {0D43FE01-F093-11CF-8940- 00A0C9054228}
使用GUID在
HKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT \ {0D43FE01-F093-11CF-8940- 00A0C9054228}
检查子项
InprocServer32
(默认)
DLL位置的值HKEY_CLASSES_ROOT\ {0D43FE01-F093-11CF-8940-00A0C9054228} \InprocServer32
(默认) - C:\Windows \System32\scrrun.dll
否<$ c $
如果您找不到,请在
在注册表中对应的 ProgId
可能是由于我们将在此详细说明的两个原因之一。
- 该DLL未注册。
- 该DLL注册在错误的区域。
如何使用Windows注册COM DLL
COM DLL可以注册,并通过运行
regsvr32创建相应的注册表项。
从Windows命令提示符使用提升的权限(<版本> 在我们继续之前,虽然操作系统的架构和ASP Web应用程序使用的模式是非常重要的。
大多数较新的硬件是64位这会造成一个难题Windows现在必须支持更新的64位架构,并仍然保持对32位架构的支持。 Microsoft提出的解决方案是将操作系统分为两部分,因此我们有64位元素和32位元素。主OS程序分为两个文件夹(仅在64位操作系统上,因为32位操作系统不必与64位操作,即使硬件能够操作)。 p>
注意:在32位系统上只使用系统文件和Windows注册表的64位位置。 / p>
在64位操作系统上,系统程序位于
对于64位程序
%SystemRoot%\System32 \\ \\
32位程序
< pre class =lang-none prettyprint-override>%SystemRoot%\SysWOW64\
这也适用于Windows注册表
-
64位
HKEY_CLASSES_ROOT
-
32位
HKEY_CLASSES_ROOT \Wow6432Node
Bit版本的Windows下面的命令将注册在32位注册表中的 PCMSRV32.DLL
,并创建相关的COM DLL注册表项。
C:\Windows\SysWOW64> regsvr32C:\Windows\PCMSRV32.DLL
IIS应用程序池
由于一切都开始支持64位仍然需要能够支持只支持32位COM的传统应用程序,因此IIS在IIS 6.0中引入了(从Windows Server 2003开始,Service Pack 1)在应用程序池设置下的可配置属性 Enabled32BitAppOnWin64
,它允许应用程序池在64位版本的Windows上以32位模式运行。
您注册COM DLL以知道您应该注册它,您需要知道应用程序池是否在32位模式下运行。在IIS 7.0及以上版本中,您可以从IIS管理器应用程序中的应用程序池属性中检查。该设置位于 General
部分下的高级设置
中,名为启用32位应用程序
(也可以在 applicationHost.config
中使用 enable32BitAppOnWin64
< ApplicationPools>
部分)。
-
如果
启用32位应用程序
设置为False
IIS应用程序池以本地64位模式运行,任何需要由ASP Web应用程序使用的COM DLL都需要支持64位,并使用64位版本
regsvr32.exe
添加到64位注册表中。C:\Windows\System32> regsvr32C:\Windows\PCMSRV32.DLL
-
如果
启用32位应用程序
设置为True
IIS应用程序池以32位模式运行,任何需要由ASP Web应用程序使用的COM DLL都需要32位COM DLL,使用32位版本的
regsvr32.exe
注册到32位注册表中。C:\Windows\SysWOW64> regsvr32C:\Windows\PCMSRV32.DLL
注册COM DLL使用错误版本 regsvr32.exe
例如使用
C:\Windows \SysWOW64> regsvr32C:\Windows\PCMSRV32.DLL
在64位版本的Windows上使用32位注册表注册COM DLL时,当IIS应用程序池不处于32位模式时,将导致ASP 500.100
内部伺服器错误
伺服器物件错误'ASP 0177:8007007e'
Server.CreateObject失败
COM DLL清单
-
什么是IIS应用程序池高级设置
启用32位应用程序
设置为,对注册COM DLL的影响? -
是使用架构特定版本
>regsvr32.exe
(如果Windows版本不是64位使用默认值),反映启用32位应用程序
-
Windows注册表在
$ b的架构特定位置是否包含ProgId
$ bHKEY_CLASSES_ROOT
b
$ b
有用的链接
We have been trying to install a COM DLL on a new server. The interface is Classic ASP. The Map Connector DLL seems to be the problem but that is as far as I am able to get.
We are unable to get the pages served by IIS to give anything other than a 500 error.
When tracing the 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
The DLL is PCMSRV32.DLL
in 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
What Causes This error?
Server.CreateObject Failed
is caused most commonly when Web Applications are moved from one Web Server to another without an understanding of external COM components that are in use and registered with the Web server.
From PRB: Server.CreateObject Returns HTTP 500.100 or ASP 0177 Error (0x8007007E)
This error occurs when you attempt to use the Server.CreateObject method to instantiate an object that is not registered on the local system.
Identifying the Source of the Error
If you are using COM components inside a ASP Web application you will see a line like this
set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer")
Usually the error will point to the Set
line which makes identifying the cause easier (luckily you have some nice trace code in place so it's even better).
What If You Don't Know Where the DLL Is Located?
Note: Please be careful when accessing the Windows Registry as it is very easier to inadvertently make changes that have serious consequences for the Operating System and in extreme cases will require a system restore or re-install / repair.
The string inside the CreateObject
method is known as a ProgId
and is used as an identifier to a key inside the Windows Registry that can be found inside the
Note: Windows Registry can be browsed in most versions of Windows using the
regedit.exe
also known as the Registry Editor. Be very careful when using this tool to browse the Windows Registry.
HKEY_CLASSES_ROOT
and by extension
HKEY_LOCAL_MACHINE\Classes
Whenever the ASP processor encounters a ProgId
it attempts to talk to the Windows Registry and find a corresponding key that denotes the location of the registered COM accessible DLL.
HKEY_CLASSES_ROOT\PCMServer.PCMServer
A common approach to this is the key contains a subkey called CLSID
which points to the Class GUID for the associated registered DLL. Once the GUID key is located in the
HKEY_CLASSES_ROOT
hive it can be used to find the location by looking in the subkey
HKEY_CLASSES_ROOT\{GUID from CLSID}\InprocServer32
where the location will be stored in the (default)
value.
Example Using the
ProgId
-Scripting.FileSystemObject
Locate
Scripting.FileSystemObject
subkey inHKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT\Scripting.FilesystemObject
Identify GUID from subkey
CLSID
HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"
Use GUID to find registered DLL subkey in
HKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}
Check subkey
InprocServer32
(default)
value for the DLL locationHKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32 (default) - "C:\Windows\System32\scrrun.dll"
No ProgId
for PCMServer.PCMServer
in the Registry?
If you cannot find the corresponding ProgId
in the registry it is likely due to one of two reasons we will elaborate on here.
- The DLL is not registered.
- The DLL is registered in the wrong area.
How to register COM DLL with Windows
COM DLLs can be registered and have the corresponding Registry entries created by running the regsvr32.exe
tool from the Windows Command Prompt using elevated permissions (this varies from version to version of Windows).
Before we continue though the architecture of both the Operating System and the mode used by the ASP Web application are very important.
Most newer hardware is 64 Bit this creates a conundrum in Windows as it now has to support newer 64 bit architecture and still maintain support for 32 bit architecture. The solution Microsoft came up with was to split the OS in two, so we have 64 bit elements and 32 bit elements. The main OS programs are broken down into two folders (only on 64 bit OS because a 32 Bit OS doesn't have to contend with 64 Bit, even if the hardware is capable of it).
Note: On 32 Bit only systems just use the 64 Bit locations for both System Files and the Windows Registry.
On a 64 Bit OS the System Programs are located in
For 64 Bit programs
%SystemRoot%\System32\
For 32 Bit programs
%SystemRoot%\SysWOW64\
This is also applies to the Windows Registry
64 Bit
HKEY_CLASSES_ROOT
32 Bit
HKEY_CLASSES_ROOT\Wow6432Node
So for example on a 64 Bit version of Windows the following command will register the PCMSRV32.DLL
in the 32 Bit Registry and create the associated COM DLL registry keys.
C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL"
IIS Application Pool
As everything begins to support 64 Bit including IIS you still need to be able to support legacy applications that only support 32 Bit COM, so IIS introduced in IIS 6.0 (starting with Windows Server 2003, Service Pack 1) under the Application Pool settings the configurable property Enabled32BitAppOnWin64
which allows the Application Pool to run in 32 Bit mode on 64 Bit versions of Windows.
With this in mind before you register the COM DLL to know where you should be registering it you need to know whether the Application Pool is running in 32 Bit Mode. In IIS 7.0 and above you can just check this from the Application Pool properties inside the IIS Manager application. The setting is in the Advanced Settings
under the General
section and is called Enable 32-Bit Applications
(can also be configured in the applicationHost.config
using enable32BitAppOnWin64
under the <ApplicationPools>
section).
If
Enable 32-Bit Applications
is set toFalse
The IIS application Pool is running in native 64 Bit mode and any COM DLLs that need to be used by the ASP Web Application will need to support 64 Bit and be registered using the 64 Bit version of
regsvr32.exe
to be added into the 64 Bit registry.C:\Windows\System32>regsvr32 "C:\Windows\PCMSRV32.DLL"
If
Enable 32-Bit Applications
is set toTrue
The IIS Application Pool is running in 32 Bit Mode and any COM DLLs that need to be used by the ASP Web Application will need to be 32 Bit COM DLLs and be registered using the 32 Bit version of
regsvr32.exe
to be added into the 32 Bit registry.C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL"
Registering the COM DLL Using the Wrong Version of regsvr32.exe
For example using
C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL"
to register the COM DLL with the 32 Bit registry on a 64 Bit version of Windows when the IIS Application Pool is not in 32 Bit Mode will cause the ASP 500.100
Internal Server error
Server object error 'ASP 0177: 8007007e'
Server.CreateObject Failed
COM DLL Checklist
What is the IIS Application Pool Advanced Setting
Enable 32-Bit Applications
set to, as it impacts on how you register the COM DLL?Is the DLL registered using the architecture specific version of
regsvr32.exe
(if Windows version isn't 64 Bit use the default) that reflects the setting ofEnable 32-Bit Applications
?Does the Windows Registry contain a
ProgId
for the DLL in the architecture specific location ofHKEY_CLASSES_ROOT
that reflects the setting of
Enable 32-Bit Applications
?Does the
InprocServer32
key contain the correct location for the DLL?
Useful Links
这篇关于错误ASP 0177:8007007e COM DLL的Server.CreateObject失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!