可以创建64位Scripting.FileSystemObject但不能创建32位

时间:2015-06-13 01:11:39

标签: windows-server-2012-r2 vb6

我的客户端在虚拟机中运行Windows 2012 R2 64位。我给客户端一个用VB6编译的32位程序,该程序在这一行上失败了:

Set Run.FileSys = CreateObject("Scripting.FileSystemObject")

其中Run.FileSys的类型为Variant。这个程序多年来在许多系统上运行,但在这种情况下,它失败了

Run-time error '429':
ActiveX component can't create object

客户端运行时

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实例,我的程序在这台计算机上运行时没有错误。我们比较了计算机上的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,无权将其关闭。

客户刚刚做了一个测试,让我怀疑这个关于病毒扫描程序的假设。她创建了自己的VBScript,VB6程序和创建Scripting.FileSystemObject的VB.Net程序。结果是:

  • VBScript:成功(我想这必须是64位?)
  • VB6(32位):失败
  • VB.Net,32位:失败
  • VB.Net,64位:成功

所以似乎没有任何东西阻止了64位版本的SCRRUN.DLL,但是32位版本不起作用。我想告诉客户重新安装Windows Scripting Host,但我不知道如何做到这一点或者是否可行。有谁知道我怎么解决这个问题?

3 个答案:

答案 0 :(得分:0)

我遇到了类似的问题(我认为)。我有一个VB6程序在Windows 7 32位上运行得很好。当我移动到64位(在Windows 7和Windows 8上)时,程序将失败。我正在使用打印的32位DLL。经过多次搜索后,我发现微软已经意识到这个问题,并表示不会修复。在您访问某些特定类型的硬件之前,32位DLL似乎有效。

答案 1 :(得分:0)

客户端能够恢复目标计算机(虽然我不清楚恢复实际采用的形式)。她发现在恢复后调用CreateObject("Scripting.FileSystemObject")的测试程序会成功,但在运行我提供的安装程序后,测试程序将失败。

安装程序是从后面开始的VB6安装程序。我注意到它不应该覆盖旧版本的任何依赖项,但它似乎尝试注册每个依赖项,无论是否安装了新版本。作为一项实验,我从预装Windows 2012 R2的安装程序中删除了所有依赖项。这解决了这个问题!

客户恢复目标计算机并尝试实验是一件麻烦事,所以我无法缩小到更具体的范围,也不明白为什么这个问题没有发生在我有权访问的另外两个Windows 2012 R2示例。我只是怀疑问题是由调用Windows API函数引起的,该函数注册了一些不需要它的DLL,TLB或OCX文件。我后来确定打包到此安装程序中的许多依赖项都是预先安装了Windows XP SP3的文件以及之后的所有内容,因此我将从安装程序中永久删除它们。

答案 2 :(得分:-1)

似乎配置不是编程问题。

这需要进行5000万次维修(详见https://technet.microsoft.com/en-us/library/cc722188(v=ws.10).aspx

启动修复

如果您的计算机安装了单个操作系统,请在计算机重新启动时反复按F8键。在出现Windows徽标之前,您需要按F8。如果出现Windows徽标,则需要重试。 [从开始 - 帮助和支持]。

在“高级启动选项”屏幕上,使用箭头键突出显示“修复计算机”,然后按Enter。

选择启动修复。

启动修复会生成一个日志文件。请参阅C:\ Windows \ System32 \ LogFiles \ Srt \ SrtTrail.txt。

要在Windows未启动时进行访问,请在“高级启动选项”屏幕上,使用箭头键突出显示“修复计算机”,然后按Enter。

选择命令提示符。

类型

type C:\Windows\System32\LogFiles\Srt\SrtTrail.txt |more

同时卸载然后重新安装Service Pack通常会刷新可能已损坏的文件。