如何在VBScript中引用MS Windows 7 64bit下的WIN32对象

How to reference to WIN32 object under MS Windows 7 64bit in VBScript

我有这个 VBScript 在 MS Windows 7 32 位下的本地 html 页面中工作得很好,因为它引用了 MS Windows 文本到语音包是 32 位.

Dim sapi
Set sapi=CreateObject("sapi.spvoice")
  For Each Voice In sapi.getvoices
     I = I + 1
     msgbox "" & (I - 1) & " - " & Voice.GetDescription
Next

我遇到的问题是MS Windows 7 64下的同一个包安装在C:\Windows\SysWOW64\

所以如果你启动这个控制台它是可见的

C:\Windows\SysWOW64\Speech\SpeechUX\sapi.cpl

它对上面的 VBScript 有影响,因为它使用 64 位 SAPI 而不是 32 位 SAPI。

所以我想找一个正确的way/code来使用

Set sapi=CreateObject("sapi.spvoice")

对于 WIN32 对象。所以有点像如何在 HTML 页面.[= 的 VBScript 中的 Windows 64 位下创建 ActiveX Win32 16=]

如何实现?

当您第一次提出 VBScript 运行 在 Internet 浏览器中 的问题时并不清楚(假设 Internet Explorer 在其他浏览器中内置了对 VBScript 的支持是none存在).

在使用 Internet 浏览器的情况下,处理多个体系结构时应用相同的规则。客户端不是脚本主机 cscriptwscript Internet 浏览器承担此角色。

因此,我们必须确保我们使用的浏览器架构版本正确。

x64 (64 位)

%ProgramFiles%\Internet Explorer\iexplore.exe

x86 (32 位)

%ProgramFiles(x86)%\Internet Explorer\iexplore.exe

如果 Internet 浏览器的架构版本错误,CreateObject() 函数将在注册表的错误部分查找相应的 ProgId (sapi.spvoice),这会导致这样的错误:

Error: ActiveX component can't create object
Code: 800A01AD
Source: Microsoft VBScript Runtime Error

这在仅 32 位的应用程序中更为常见,因为注册表的 64 位部分永远不会包含相应的已注册 COM 组件。

您有时可能会发现,无论出于何种原因,您都必须手动注册 COM DLL,这也会让某些人感到困惑。了解差异很重要。

注册一个 x64 COM DLL

%SystemRoot%\System32\regsvr32.exe

注册一个 x86 COM DLL

%SystemRoot%\SysWOW64\regsvr32.exe

同样重要的是要注意,这仅适用于 64 位 Windows 操作系统,因为 32 位操作系统将仅包含 64 位等效位置。 %ProgramFiles(x86)SysWOW64 都是特定于 64 位 Windows 操作系统的位置。