可以创建 Scripting.FileSystemObject 64 位但不能创建 32 位
Can create Scripting.FileSystemObject 64-bit but not 32-bit
我的客户端在虚拟机中安装了 Windows 2012 R2 64 位 运行ning。我给客户端一个用VB6编译的32位程序,在这一行失败:
Set Run.FileSys = CreateObject("Scripting.FileSystemObject")
其中 Run.FileSys 的类型为 Variant。多年来,这个程序在很多很多系统上都有 运行,但在这种情况下它失败了
Run-time error '429':
ActiveX component can't create object
当客户端运行s
regsvr32 scrrun.dll
在SysWow64文件夹中,提示注册成功。我指示她 运行 以下内容:
reg query "HKEY_CLASSES_ROOT\Scripting.FileSystemObject\CLSID"
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings\Enabled"
reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Script Host\Settings\Enabled"
它表示 CLSID 值为 {0D43FE01-F093-11CF-8940-00A0C9054228},"Enabled" 键(可用于禁用脚本宿主)不存在。
查看SysWow64文件夹中的文件SCRRUN.DLL,版本号为5.8.9600.17415.
我可以访问 Windows 2012 R2 的另一个实例,我的程序 运行s 在这台计算机上没有错误。我们比较了 Dependency Walker 在我的计算机和客户端计算机上的输出。在两台计算机上,Dependency Walker 输出在序列中的某个点之前看起来是一样的。这是我的计算机输出的最后一部分:
Loaded "SXS.DLL" at address 0x681A0000 by thread 1.
Loaded "DWMAPI.DLL" at address 0x73E30000 by thread 1.
Loaded "CLBCATQ.DLL" at address 0x755D0000 by thread 1.
Loaded "SCRRUN.DLL" at address 0x67BB0000 by thread 1.
Loaded "VERSION.DLL" at address 0x74910000 by thread 1.
这是客户端计算机中发生故障的同一部分:
Loaded "SXS.DLL" at address 0x72B70000 by thread 1.
Loaded "DWMAPI.DLL" at address 0x724F0000 by thread 1.
Loaded "CLBCATQ.DLL" at address 0x74DE0000 by thread 1.
Loaded "CRYPTSP.DLL" at address 0x747E0000 by thread 1.
Loaded "RSAENH.DLL" at address 0x74710000 by thread 1.
Loaded "BCRYPT.DLL" at address 0x747C0000 by thread 1.
Thread 2 started in "NTDLL.DLL" at address 0x77324A00.
Thread 3 started in "NTDLL.DLL" at address 0x77324A00.
Thread 4 started in "COMBASE.DLL" at address 0x74C8D7E0.
First chance exception 0xC000008F (Float Inexact Result) occurred in "KERNELBASE.DLL" at address 0x75BC4598 by thread 1.
First chance exception 0xC000008F (Float Inexact Result) occurred in "KERNELBASE.DLL" at address 0x75BC4598 by thread 1.
Thread 2 exited with code 0 (0x0).
Thread 3 exited with code 0 (0x0).
Thread 1 exited with code 0 (0x0).
Exited "VB6SCRIPTINGTEST.EXE" (process 0x94) with code 0 (0x0) by thread 4.
所以当程序应该加载 SCRRUN.DLL 时,它会加载 CRYPTSP.DLL 和其他。客户说驱动器加密没有打开。我没有根据的猜测是,这是病毒保护将自身插入到进程中的结果。客户端有 MacAfee Virus Scan Enterprise 8.8 运行ning,没有关闭它的权限。
客户刚刚做了一个测试,让我怀疑这个关于病毒扫描程序的假设。她创建了自己的 VBScript、VB6 程序和创建 Scripting.FileSystemObject 的 VB.Net 程序。结果是:
- VBScript:成功(我想这一定是 64 位的吧?)
- VB6(32 位):失败
- VB.Net,32 位:失败
- VB.Net,64 位:成功
看来没有什么能阻止 SCRRUN.DLL 的 64 位版本,但 32 位版本不起作用。我想告诉客户重新安装 Windows Scripting Host,但我不知道该怎么做或是否可行。有谁知道我该如何解决这个问题?
看来是配置问题,不是编程问题。
这可以修复 5000 万次(详情见 https://technet.microsoft.com/en-us/library/cc722188(v=ws.10).aspx)
启动修复
如果您的计算机只安装了一个操作系统,请在计算机重新启动时重复按 F8 键。您需要在出现 Windows 徽标之前按 F8。如果出现 Windows 标志,您将需要重试。 [从头开始 - 帮助和支持]。
在高级启动选项屏幕上,使用箭头键突出显示修复您的计算机,然后按 ENTER。
Select 启动修复。
启动修复创建一个日志文件。见 C:\Windows\System32\LogFiles\Srt\SrtTrail.txt.
要访问如果 Windows 无法启动,请在“高级启动选项”屏幕上使用箭头键突出显示“修复您的计算机”,然后按 ENTER。
Select 命令提示符。
类型
type C:\Windows\System32\LogFiles\Srt\SrtTrail.txt |more
同时卸载然后重新安装 Service Pack 通常会刷新可能已损坏的文件。
我有一个类似的问题(我认为)。我有一个 运行 在 Windows 7 32 位上运行良好的 VB6 程序。当我移动到 64 位时(在 windows 7 和 windows 8 上)程序会失败。我正在使用打印的 32 位 DLL。经过大量搜索,我发现微软已经意识到这个问题,并表示不会修复。在您访问某些特定类型的硬件之前,32 位 DLL 似乎可以正常工作。
客户端能够还原目标计算机(尽管我不清楚还原实际上采用的是什么形式)。她发现一个调用CreateObject("Scripting.FileSystemObject")
的测试程序恢复后会成功,但是运行我提供的安装程序后,测试程序会失败
安装程序是以前的 VB6 安装程序。我注意到它不应该用旧版本覆盖任何依赖项,但它似乎确实试图注册每个依赖项,无论是否安装了新版本。作为实验,我从 Windows 2012 R2 预装的安装程序中删除了所有依赖项。这解决了问题!
客户端恢复目标计算机和尝试实验有些麻烦,所以我无法缩小到更具体的范围,我也不明白为什么这个问题没有发生在另外两个我有权访问的 Windows 2012 R2 示例。我只是怀疑问题是由调用 Windows API 函数引起的,该函数注册了一些不需要它的 DLL、TLB 或 OCX 文件。我随后确定打包到此安装程序中的许多依赖项是 Windows XP SP3 及之后的所有内容预装的文件,因此我将从安装程序中永久删除它们。
我的客户端在虚拟机中安装了 Windows 2012 R2 64 位 运行ning。我给客户端一个用VB6编译的32位程序,在这一行失败:
Set Run.FileSys = CreateObject("Scripting.FileSystemObject")
其中 Run.FileSys 的类型为 Variant。多年来,这个程序在很多很多系统上都有 运行,但在这种情况下它失败了
Run-time error '429':
ActiveX component can't create object
当客户端运行s
regsvr32 scrrun.dll
在SysWow64文件夹中,提示注册成功。我指示她 运行 以下内容:
reg query "HKEY_CLASSES_ROOT\Scripting.FileSystemObject\CLSID"
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings\Enabled"
reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Script Host\Settings\Enabled"
它表示 CLSID 值为 {0D43FE01-F093-11CF-8940-00A0C9054228},"Enabled" 键(可用于禁用脚本宿主)不存在。
查看SysWow64文件夹中的文件SCRRUN.DLL,版本号为5.8.9600.17415.
我可以访问 Windows 2012 R2 的另一个实例,我的程序 运行s 在这台计算机上没有错误。我们比较了 Dependency Walker 在我的计算机和客户端计算机上的输出。在两台计算机上,Dependency Walker 输出在序列中的某个点之前看起来是一样的。这是我的计算机输出的最后一部分:
Loaded "SXS.DLL" at address 0x681A0000 by thread 1.
Loaded "DWMAPI.DLL" at address 0x73E30000 by thread 1.
Loaded "CLBCATQ.DLL" at address 0x755D0000 by thread 1.
Loaded "SCRRUN.DLL" at address 0x67BB0000 by thread 1.
Loaded "VERSION.DLL" at address 0x74910000 by thread 1.
这是客户端计算机中发生故障的同一部分:
Loaded "SXS.DLL" at address 0x72B70000 by thread 1.
Loaded "DWMAPI.DLL" at address 0x724F0000 by thread 1.
Loaded "CLBCATQ.DLL" at address 0x74DE0000 by thread 1.
Loaded "CRYPTSP.DLL" at address 0x747E0000 by thread 1.
Loaded "RSAENH.DLL" at address 0x74710000 by thread 1.
Loaded "BCRYPT.DLL" at address 0x747C0000 by thread 1.
Thread 2 started in "NTDLL.DLL" at address 0x77324A00.
Thread 3 started in "NTDLL.DLL" at address 0x77324A00.
Thread 4 started in "COMBASE.DLL" at address 0x74C8D7E0.
First chance exception 0xC000008F (Float Inexact Result) occurred in "KERNELBASE.DLL" at address 0x75BC4598 by thread 1.
First chance exception 0xC000008F (Float Inexact Result) occurred in "KERNELBASE.DLL" at address 0x75BC4598 by thread 1.
Thread 2 exited with code 0 (0x0).
Thread 3 exited with code 0 (0x0).
Thread 1 exited with code 0 (0x0).
Exited "VB6SCRIPTINGTEST.EXE" (process 0x94) with code 0 (0x0) by thread 4.
所以当程序应该加载 SCRRUN.DLL 时,它会加载 CRYPTSP.DLL 和其他。客户说驱动器加密没有打开。我没有根据的猜测是,这是病毒保护将自身插入到进程中的结果。客户端有 MacAfee Virus Scan Enterprise 8.8 运行ning,没有关闭它的权限。
客户刚刚做了一个测试,让我怀疑这个关于病毒扫描程序的假设。她创建了自己的 VBScript、VB6 程序和创建 Scripting.FileSystemObject 的 VB.Net 程序。结果是:
- VBScript:成功(我想这一定是 64 位的吧?)
- VB6(32 位):失败
- VB.Net,32 位:失败
- VB.Net,64 位:成功
看来没有什么能阻止 SCRRUN.DLL 的 64 位版本,但 32 位版本不起作用。我想告诉客户重新安装 Windows Scripting Host,但我不知道该怎么做或是否可行。有谁知道我该如何解决这个问题?
看来是配置问题,不是编程问题。
这可以修复 5000 万次(详情见 https://technet.microsoft.com/en-us/library/cc722188(v=ws.10).aspx)
启动修复
如果您的计算机只安装了一个操作系统,请在计算机重新启动时重复按 F8 键。您需要在出现 Windows 徽标之前按 F8。如果出现 Windows 标志,您将需要重试。 [从头开始 - 帮助和支持]。
在高级启动选项屏幕上,使用箭头键突出显示修复您的计算机,然后按 ENTER。
Select 启动修复。
启动修复创建一个日志文件。见 C:\Windows\System32\LogFiles\Srt\SrtTrail.txt.
要访问如果 Windows 无法启动,请在“高级启动选项”屏幕上使用箭头键突出显示“修复您的计算机”,然后按 ENTER。
Select 命令提示符。
类型
type C:\Windows\System32\LogFiles\Srt\SrtTrail.txt |more
同时卸载然后重新安装 Service Pack 通常会刷新可能已损坏的文件。
我有一个类似的问题(我认为)。我有一个 运行 在 Windows 7 32 位上运行良好的 VB6 程序。当我移动到 64 位时(在 windows 7 和 windows 8 上)程序会失败。我正在使用打印的 32 位 DLL。经过大量搜索,我发现微软已经意识到这个问题,并表示不会修复。在您访问某些特定类型的硬件之前,32 位 DLL 似乎可以正常工作。
客户端能够还原目标计算机(尽管我不清楚还原实际上采用的是什么形式)。她发现一个调用CreateObject("Scripting.FileSystemObject")
的测试程序恢复后会成功,但是运行我提供的安装程序后,测试程序会失败
安装程序是以前的 VB6 安装程序。我注意到它不应该用旧版本覆盖任何依赖项,但它似乎确实试图注册每个依赖项,无论是否安装了新版本。作为实验,我从 Windows 2012 R2 预装的安装程序中删除了所有依赖项。这解决了问题!
客户端恢复目标计算机和尝试实验有些麻烦,所以我无法缩小到更具体的范围,我也不明白为什么这个问题没有发生在另外两个我有权访问的 Windows 2012 R2 示例。我只是怀疑问题是由调用 Windows API 函数引起的,该函数注册了一些不需要它的 DLL、TLB 或 OCX 文件。我随后确定打包到此安装程序中的许多依赖项是 Windows XP SP3 及之后的所有内容预装的文件,因此我将从安装程序中永久删除它们。