错误ASP 0177:8007007e CreateObject对COM DLL失败
我们一直在尝试在新服务器上安装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错误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
下面的建议与中使用的
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}”
HKEY\U CLASSES\U ROOT\CLSID中查找已注册的DLL子项
HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}
(默认)
值以获取DLL位置
HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32
(默认)-“C:\Windows\System32\scrun.dll”
PCMServer.PCMServer
没有ProgId
?
如果在注册表中找不到相应的ProgId
,可能是由于以下两个原因之一
regsvr32.exe
工具来注册并创建相应的注册表项(这因Windows版本而异)
在我们继续之前,操作系统的体系结构和ASP Web应用程序使用的模式都非常重要
大多数较新的硬件是64位的,这在Windows中造成了一个难题,因为它现在必须支持较新的64位体系结构,并且仍然支持32位体系结构。微软提出的解决方案是将操作系统一分为二,因此我们有64位元素和32位元素。主操作系统程序分为两个文件夹(仅在64位操作系统上,因为32位操作系统不必与64位操作系统抗衡,即使硬件有能力)
注意:在仅32位系统上,只需将64位位置用于系统文件和Windows注册表
在64位操作系统上,系统程序位于
%SystemRoot%\System32\
%SystemRoot%\SysWOW64\
HKEY\U类\U根
HKEY\u CLASSES\u ROOT\wow6432节点
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