我们一直在尝试在新服务器上安装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>
PCMSRV32.DLL
GLOBAL.ASA:
c:\windows
答案 0 :(得分:17)
以下建议与
中Server.CreateObject
和CreateObject
的使用有关
Web服务器部分特定于asp-classic,但仍值得一读。
当Web应用程序从一个Web服务器移动到另一个Web服务器而不了解正在使用并向Web服务器注册的外部COM组件时,最常出现Server.CreateObject失败
。
来自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>
注意:访问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
在
中找到Scripting.FileSystemObject
HKEY_CLASSES_ROOT
子项HKEY_CLASSES_ROOT\Scripting.FilesystemObject
从子项
中识别GUIDCLSID
HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}"
使用GUID在
中查找已注册的DLL子项HKEY_CLASSES_ROOT
HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}
- 醇>
检查DLL位置的子项
InprocServer32
(default)
值HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32 (default) - "C:\Windows\System32\scrrun.dll"
ProgId
没有PCMServer.PCMServer
?如果在注册表中找不到相应的ProgId
,可能是由于我们将在此详述的两个原因之一。
可以注册COM DLL并通过使用提升的权限从Windows命令提示符运行regsvr32.exe
工具来创建相应的注册表项(此版本因Windows版本而异)。
在我们继续之前,操作系统和ASP Web应用程序使用的模式的架构非常重要。
大多数较新的硬件是64位,这在Windows中造成了一个难题,因为它现在必须支持更新的64位架构,并且仍然支持32位架构。微软提出的解决方案是将操作系统分成两部分,因此我们有64位元素和32位元素。主OS程序分为两个文件夹(仅在64位操作系统上,因为32位操作系统不必与64位竞争,即使硬件能够支持它)。
注意:在32位上只有系统只使用系统文件和Windows注册表的64位位置。
在64位操作系统上,系统程序位于
中对于64位程序
%SystemRoot%\System32\
对于32位程序
%SystemRoot%\SysWOW64\
这也适用于Windows注册表
64位
HKEY_CLASSES_ROOT
32位
HKEY_CLASSES_ROOT\Wow6432Node
因此,例如在64位版本的Windows上,以下命令将在32位注册表中注册PCMSRV32.DLL
并创建关联的COM DLL注册表项。
C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL"
由于一切都开始支持包含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
例如使用
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失败
什么是IIS应用程序池高级设置Enable 32-Bit Applications
设置为,因为它会影响您注册COM DLL的方式?
是否使用体系结构特定版本的regsvr32.exe
注册了DLL(如果Windows版本不是64位使用默认值),它反映了{{{1}的设置1}}
Windows注册表是否在架构特定位置包含Enable 32-Bit Applications
ProgId
反映了HKEY_CLASSES_ROOT
?
Enable 32-Bit Applications
键是否包含DLL的正确位置?
在我用来访问COM DLL (ApplicationIdentity,LocalSystem,NetworkService等)的帐户的上下文中,我是否有权访问这两个物理DLL文件和注册表项?