错误ASP 0177:8007007e COM DLL的CreateObject失败 [英] Error ASP 0177: 8007007e CreateObject fails for COM DLL

查看:104
本文介绍了错误ASP 0177:8007007e COM DLL的CreateObject失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们一直试图在新服务器上安装COM DLL.该界面是经典ASP.地图连接器DLL似乎是问题所在,但据我所知.

我们无法让IIS服务的页面提供500错误以外的任何内容.

跟踪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

DLL在c:\windows中的PCMSRV32.DLL

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

解决方案

以下建议与

中的Server.CreateObjectCreateObject使用有关

的问题

"Web服务器"部分特定于,但仍然值得一读.


什么原因导致此错误?

Server.CreateObject失败

最常见的原因是将Web应用程序从一台Web服务器移动到另一台Web服务器而又不了解正在使用并已在Web服务器上注册的外部COM组件的情况.

来自 PRB:Server.CreateObject返回HTTP 500.100或ASP 0177错误(0x8007007E )

当您尝试使用 Server.CreateObject 方法实例化未在本地系统上注册的对象时,会发生此错误.

确定错误原因

如果您在ASP Web应用程序中使用COM组件,则会看到类似这样的行

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

通常,错误将指向Set行,这使确定原因更加容易(幸运的是,您有一些不错的跟踪代码,因此更好)..

如果您不知道DLL的位置怎么办?

注意:访问Windows注册表时请小心,因为它很容易无意间对操作系统造成严重影响,并且在极端情况下需要进行系统还原或重新安装/维修.

CreateObject方法中的字符串称为ProgId,用作Windows注册表中可以在

中找到的键的标识符.

注意:可以使用regedit.exe(也称为注册表编辑器)在大多数Windows版本中浏览Windows注册表.使用此工具浏览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\CLSID
 

蜂巢可以通过在子项中查找来找到位置

 HKEY_CLASSES_ROOT\CLSID\{GUID from CLSID}\InprocServer32
 

将位置存储在(default)值中的位置.

使用ProgId-Scripting.FileSystemObject

的示例

  1. HKEY_CLASSES_ROOT

    中找到Scripting.FileSystemObject子项

     HKEY_CLASSES_ROOT\Scripting.FilesystemObject
     

  2. 从子项CLSID

    中识别GUID

     HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID
    
    (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"  
     

  3. 使用GUID在HKEY_CLASSES_ROOT\CLSID

    中查找已注册的DLL子项

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

  4. 检查子项InprocServer32 (default)的DLL位置值

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

注册表中的PCMServer.PCMServer

没有ProgId?

如果您无法在注册表中找到相应的ProgId,则可能是由于以下两个原因之一.

  1. 该DLL未注册.
  2. 该DLL被注册在错误的区域.

如何在Windows中注册COM DLL

可以注册

COM DLL,并使用提升的权限(这因Windows版本而异)从Windows命令提示符运行regsvr32.exe工具来创建相应的注册表项.. >

在继续之前,尽管操作系统的体系结构和ASP Web应用程序使用的模式都非常重要.

大多数较新的硬件都是64位,这在Windows中造成了一个难题,因为它现在必须支持较新的64位体系结构,并且仍然保持对32位体系结构的支持. Microsoft提出的解决方案是将操作系统分为两部分,因此我们有64位元素和32位元素. .主要的OS程序分为两个文件夹(仅在64位OS上,因为32位OS不必与64位竞争,即使硬件具备此能力)... >

注意::在仅32位的系统上,仅将64位位置用于系统文件和Windows注册表.

在64位OS上,系统程序位于

  1. 用于64位程序

     %SystemRoot%\System32\
     

  2. 用于32位程序

     %SystemRoot%\SysWOW64\
     

这也适用于Windows注册表

  1. 64位

     HKEY_CLASSES_ROOT
     

  2. 32位

     HKEY_CLASSES_ROOT\Wow6432Node
     

因此,例如在64位版本的Windows上,以下命令将在32位注册表中注册PCMSRV32.DLL并创建关联的COM DLL注册表项.

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

IIS应用程序池

随着一切开始支持包括IIS在内的64位,您仍然需要能够支持仅支持32位COM的旧应用程序,因此IIS 6.0 中引入了IIS(从Windows Server 2003 Service Pack 1开始)在应用程序池"设置下的可配置属性Enabled32BitAppOnWin64允许应用程序池在64位版本的Windows上以32位模式运行.

考虑到这一点,在注册COM DLL知道应该在哪里注册之前,您需要知道应用程序池是否以32位模式运行.在IIS 7.0及更高版本中,您可以仅从IIS管理器应用程序中的应用程序池"属性中进行检查.设置位于General部分下的Advanced Settings中,称为Enable 32-Bit Applications (也可以使用<ApplicationPools>部分下的enable32BitAppOnWin64applicationHost.config中进行配置)./p>

  • 如果Enable 32-Bit Applications设置为False

    IIS应用程序池以纯64位模式运行,并且ASP Web应用程序需要使用的任何COM DLL将需要支持64位,并使用regsvr32.exe的64位版本进行注册. 64位注册表.

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

  • 如果Enable 32-Bit Applications设置为True

    IIS应用程序池以32位模式运行,并且ASP Web应用程序需要使用的所有COM DLL都必须是32位COM DLL,并使用要添加的32位版本的regsvr32.exe进行注册.进入32位注册表.

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

使用错误版本的regsvr32.exe

注册COM DLL

例如,使用

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

当IIS应用程序池不在32位模式下时,在64位版本的Windows上向32位注册表注册COM DLL将导致ASP 500.100内部服务器错误

服务器对象错误'ASP 0177:8007007e'

Server.CreateObject失败


COM DLL清单

  1. IIS应用程序池高级设置Enable 32-Bit Applications设置为什么,因为它会影响您注册COM DLL的方式?

  2. DLL是否使用regsvr32.exe 的特定于体系结构的版本注册(如果Windows版本不是64位,请使用默认设置)反映Enable 32-Bit Applications的设置?

  3. Windows注册表在特定于体系结构的位置中是否包含DLL的ProgId

     HKEY_CLASSES_ROOT
     

    反映Enable 32-Bit Applications设置的

    ?

  4. InprocServer32密钥是否包含DLL的正确位置?

  5. 在我用于访问COM DLL (ApplicationIdentity,LocalSystem,NetworkService等)的帐户的上下文中,我是否有权访问物理DLL文件和注册表项?


有用的链接

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

解决方案

The advice below relates to both Server.CreateObject and CreateObject use in

The Web Server sections are specific to but still worth reading.


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

hive it can be used to find the location by looking in the subkey

HKEY_CLASSES_ROOT\CLSID\{GUID from CLSID}\InprocServer32

where the location will be stored in the (default) value.

Example Using the ProgId - Scripting.FileSystemObject

  1. Locate Scripting.FileSystemObject subkey in HKEY_CLASSES_ROOT

    HKEY_CLASSES_ROOT\Scripting.FilesystemObject
    

  2. Identify GUID from subkey CLSID

    HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID
    
    (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"  
    

  3. Use GUID to find registered DLL subkey in HKEY_CLASSES_ROOT\CLSID

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

  4. Check subkey InprocServer32 (default) value for the DLL location

    HKEY_CLASSES_ROOT\CLSID\{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.

  1. The DLL is not registered.
  2. 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

  1. For 64 Bit programs

    %SystemRoot%\System32\
    

  2. For 32 Bit programs

    %SystemRoot%\SysWOW64\
    

This is also applies to the Windows Registry

  1. 64 Bit

    HKEY_CLASSES_ROOT
    

  2. 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 to False

    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 to True

    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

  1. What is the IIS Application Pool Advanced Setting Enable 32-Bit Applications set to, as it impacts on how you register the COM DLL?

  2. 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 of Enable 32-Bit Applications?

  3. Does the Windows Registry contain a ProgId for the DLL in the architecture-specific location of

    HKEY_CLASSES_ROOT
    

    that reflects the setting of Enable 32-Bit Applications?

  4. Does the InprocServer32 key contain the correct location for the DLL?

  5. In the context of the account I'm using to access the COM DLL (ApplicationIdentity, LocalSystem, NetworkService etc), do I have permission to access both the physical DLL file and the registry entries?


Useful Links

这篇关于错误ASP 0177:8007007e COM DLL的CreateObject失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆