错误ASP 0177:8007007e CreateObject对COM DLL失败

错误ASP 0177:8007007e CreateObject对COM DLL失败,dll,vbscript,asp-classic,com,jscript,vba,Dll,Vbscript,Asp Classic,Com,Jscript,Vba,我们一直在尝试在新服务器上安装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("P

我们一直在尝试在新服务器上安装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
下面的建议与中使用的
Server.CreateObject
CreateObject
有关

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


是什么导致了这个错误? Server.CreateObject失败

当Web应用程序从一个Web服务器移动到另一个Web服务器时,最常见的情况是不了解正在使用并在Web服务器上注册的外部COM组件

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

确定错误的来源 如果您在ASP Web应用程序中使用COM组件,您将看到这样一行代码

set g_pcmsrv=Server.CreateObject(“PCMServer.PCMServer”)
通常,错误会指向
设置
行,这使得识别原因变得更容易(幸运的是,您有一些很好的跟踪代码,所以它更好)

如果您不知道DLL位于何处,该怎么办? 注意:访问Windows注册表时请小心,因为很容易在不经意间做出对操作系统造成严重后果的更改,并且在极端情况下需要系统还原或重新安装/修复

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

注意:在大多数版本的Windows中,可以使用
regedit.exe
即注册表编辑器来浏览Windows注册表。使用此工具浏览Windows注册表时要非常小心

HKEY\U类\U根
进而

HKEY\U本地\U机器\Classes
每当ASP处理器遇到一个
ProgId
时,它就会尝试与Windows注册表对话,并找到一个对应的键,该键表示已注册的COM可访问DLL的位置

HKEY\u CLASSES\u ROOT\PCMServer.PCMServer
一种常见的方法是,该键包含一个名为
CLSID
的子键,该子键指向关联的已注册DLL的类GUID。一旦GUID键位于

HKEY\u CLASSES\u ROOT\CLSID
hive它可以通过查看子键来查找位置

HKEY\U CLASSES\U ROOT\CLSID\{GUID from CLSID}\InprocServer32
其中位置将存储在
(默认)
值中

示例使用
ProgId
-
脚本.FileSystemObject

  • HKEY\u CLASSES\u ROOT中找到
    Scripting.FileSystemObject
    子项

    HKEY\u CLASSES\u ROOT\Scripting.FilesystemObject
    
  • 从子项
    CLSID

    HKEY\u CLASSES\u ROOT\Scripting.FilesystemObject\CLSID
    (默认)-“{0D43FE01-F093-11CF-8940-00A0C9054228}”
    
  • 使用GUID在
    HKEY\U CLASSES\U ROOT\CLSID中查找已注册的DLL子项

    HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}
    
  • 在ProcServer32中选中子项
    (默认)
    值以获取DLL位置

    HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32
    (默认)-“C:\Windows\System32\scrun.dll”
    
  • 注册表中的
    PCMServer.PCMServer
    没有
    ProgId
    ? 如果在注册表中找不到相应的
    ProgId
    ,可能是由于以下两个原因之一

  • DLL未注册
  • DLL注册在错误的区域
  • 如何在Windows中注册COM DLL COM DLL可以通过使用提升的权限从Windows命令提示符运行
    regsvr32.exe
    工具来注册并创建相应的注册表项(这因Windows版本而异)

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

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

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

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

  • 用于64位程序

    %SystemRoot%\System32\
    
  • 对于32位程序

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

  • 64位

    HKEY\U类\U根
    
  • 32位

    HKEY\u CLASSES\u ROOT\wow6432节点
    
  • 因此,例如在64位版本的Windows上,以下命令将在32位注册表中注册
    PCMSRV32.DLL
    ,并创建关联的COM DLL注册表项

    C:\Windows\SysWOW64>regsvr32“C:\Windows\PCMSRV32.DLL”
    
    IIS应用程序池 随着包括IIS在内的所有东西都开始支持64位,您仍然需要能够支持仅支持32位COM的传统应用程序,因此IIS在IIS 6.0中引入(从Wind开始)
    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