在Windows操作系统中,32位应用程序在64位环境下运行时,为了保持兼容性,系统会执行一种称为“文件系统重定向”(File System Redirection)和“注册表重定向”(Registry Redirector)的机制。这使得32位程序在尝试访问原本属于64位系统的某些关键位置时,如`%System32%`目录和特定的注册表键,会被自动转向到相应的32位兼容路径。对于VB(Visual Basic)开发者来说,理解并处理这个问题至关重要,以确保程序在不同平台上的正确运行。
在64位系统中,`%System32%`目录实际上是指向`%WinDir%\SysWOW64`,这里存储的是32位的系统文件。而32位程序试图写入`HKEY_LOCAL_MACHINE\Software`等注册表键时,系统会将访问重定向至`HKEY_LOCAL_MACHINE\Software\Wow6432Node`,这里的Wow6432Node就是32位程序的注册表视图。
针对这种自动转向问题,VB开发者可以采取以下方法来解决:
1. 关闭文件系统重定向:
使用`Wow64DisableWow64FsRedirection`函数可以临时禁用文件系统重定向,让32位程序可以直接访问`%System32%`目录。然而,这需要谨慎操作,因为关闭重定向可能导致32位程序误操作64位系统文件。在使用后,应通过`Wow64RevertWow64FsRedirection`函数恢复文件系统重定向。
VB声明示例:
```vb
Private Declare PtrSafe Function Wow64DisableWow64FsRedirection Lib "kernel32.dll" (ByRef OldValue As Long) As Long
Private Declare PtrSafe Function Wow64RevertWow64FsRedirection Lib "kernel32.dll" (ByVal OldValue As Long) As Long
```
在需要关闭重定向的代码段前调用`Wow64DisableWow64FsRedirection`,完成后调用`Wow64RevertWow64FsRedirection`恢复。
2. 访问64位注册表:
对于注册表重定向,VB本身没有直接提供防止重定向的方法,但可以通过API函数`RegOpenKeyEx`配合特定标志来访问64位注册表。设置`samDesired`参数为`KEY_WOW64_64KEY`(常量值256或`&H100`)可以让32位程序访问64位注册表键。
API调用示例:
```vb
Private Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
```
在调用`RegOpenKeyEx`时,将`samDesired`参数设置为`KEY_ALL_ACCESS Or KEY_WOW64_64KEY`,这样可以打开64位的注册表键。
需要注意的是,直接绕过重定向可能会引发兼容性和安全性问题,因此在编程时应尽量避免不必要的操作,除非确实需要访问特定的64位系统资源。同时,对这些操作进行适当的错误处理和异常捕获是必要的,以确保程序的稳定性和安全性。在进行此类操作时,一定要清楚自己在做什么,并确保你的应用对用户系统的影响最小化。