错误ASP 0177:8007007e Server.CreateObject因COM DLL而失败

时间:2016-03-13 22:13:30

标签: dll vbscript asp-classic com

我们一直在尝试在新服务器上安装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

<tr>

中的DLL为PCMSRV32.DLL

GLOBAL.ASA:

c:\windows

1 个答案:

答案 0 :(得分:17)

以下建议与

Server.CreateObjectCreateObject的使用有关

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

导致此错误的原因是什么?

  

Server.CreateObject失败

当Web应用程序从一个Web服务器移动到另一个Web服务器而不了解正在使用并向Web服务器注册的外部COM组件时,最常出现

  

来自PRB: Server.CreateObject Returns HTTP 500.100 or ASP 0177 Error (0x8007007E)

     

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

识别错误来源

如果您在ASP Web应用程序中使用COM组件,您将看到如下所示的行

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

通常错误会指向Set行,这样可以更轻松地识别原因(幸运的是,您有一些很好的跟踪代码,所以它甚至更好)。< / p>

如果您不知道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

hive可以通过查看子项

来查找位置
HKEY_CLASSES_ROOT\{GUID from CLSID}\InprocServer32

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

  

示例使用ProgId - Scripting.FileSystemObject

     
      
  1. Scripting.FileSystemObject

    中找到HKEY_CLASSES_ROOT子项      
    HKEY_CLASSES_ROOT\Scripting.FilesystemObject
    
  2.   
  3. 从子项CLSID

    中识别GUID      
    HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID
    
    (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"  
    
  4.   
  5. 使用GUID在HKEY_CLASSES_ROOT

    中查找已注册的DLL子项      
    HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}
    
  6.   
  7. 检查DLL位置的子项InprocServer32 (default)

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

注册表中ProgId没有PCMServer.PCMServer

如果在注册表中找不到相应的ProgId,可能是由于我们将在此详述的两个原因之一。

  1. DLL未注册。
  2. DLL在错误的区域注册。
  3. 如何向Windows注册COM DLL

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

    在我们继续之前,操作系统和ASP Web应用程序使用的模式的架构非常重要。

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

      

    注意:在32位上只有系统只使用系统文件和Windows注册表的64位位置。

    在64位操作系统上,系统程序位于

    1. 对于64位程序

      %SystemRoot%\System32\
      
    2. 对于32位程序

      %SystemRoot%\SysWOW64\
      
    3. 这也适用于Windows注册表

      1. 64位

        HKEY_CLASSES_ROOT
        
      2. 32位

        HKEY_CLASSES_ROOT\Wow6432Node
        
      3. 因此,例如在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开始)< / em>在应用程序池设置下的可配置属性Enabled32BitAppOnWin64,它允许应用程序池在64位版本的Windows上以32位模式运行。

        在注册COM DLL以了解应该注册它的位置之前,请记住这一点,您需要知道应用程序池是否在32位模式下运行。在IIS 7.0及更高版本中,您只需从IIS管理器应用程序内的“应用程序池”属性中进行检查。该设置位于Advanced Settings部分下方的General,称为Enable 32-Bit Applications (也可以使用applicationHost.config下的enable32BitAppOnWin64配置<ApplicationPools> {1}}部分)

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

          IIS应用程序池以本机64位模式运行,并且ASP Web应用程序需要使用的任何COM DLL都需要支持64位并使用64位版本的regsvr32.exe进行注册添加到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上注册COM DLL与32位注册表将导致ASP 500.100内部服务器错误

          

        服务器对象错误&#39; ASP 0177:8007007e&#39;

             

        Server.CreateObject失败

        COM DLL清单

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

        2. 是否使用体系结构特定版本的regsvr32.exe 注册了DLL(如果Windows版本不是64位使用默认值),它反映了{{{1}的设置1}}

        3. Windows注册表是否在架构特定位置包含Enable 32-Bit Applications

          ProgId

          反映了HKEY_CLASSES_ROOT

        4. 的设置
        5. Enable 32-Bit Applications键是否包含DLL的正确位置?

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

        7. 有用的链接