[Windows]在64位的环境,32位的程序调用bat脚本报错

在64位的环境,32位的程序调用bat脚本执行cluster.exe 提示 “‘cluster’不是内部或外部命令...”

解决办法是加入 “cd /d C:\Windows\Sysnative”


问题描述:写了一个2_test.exe 程序调用1.bat脚本, 单独执行1.bat脚本的时候可以运行,但是通过2_test.exe调用1.bat脚本时无法运行。

2_test.exe代码:

int _tmain(int argc, _TCHAR* argv[])
{
system("1.bat");
system("pause");
return 0;
}

1.bat脚本代码:

cluster node /status

执行的结果是:

aa10b674-9915-4842-b274-79620a28d807.png

产生问题的原因是 :32位的程序在64位的环境中调用cmd时,cmd是调用到SysWOW64中cmd.exe执行,而不是调用的System32中的cmd.exe。而SysWOW64中cmd.exe中是没有cluster.exe 这个命令的。

在SysWOW64中的cmd.exe执行“cluster node”的结果:

[Windows]在64位的环境,32位的程序调用bat脚本报错_第1张图片
0de41497-5374-4192-963d-75bf362b3642.png

在System32中的cmd.exe执行“cluster node”的结果:

[Windows]在64位的环境,32位的程序调用bat脚本报错_第2张图片
0b7044a9-006b-4d77-9d6f-44c1953b1b21.png

解决办法:在调用的脚本中加入 “cd /d C:\Windows\Sysnative”, 调用 System32中的cmd.exe

1.bat 脚本修改:

cd /d C:\Windows\Sysnative
cluster node /status

运行结果:

[Windows]在64位的环境,32位的程序调用bat脚本报错_第3张图片
fb9b6b9c-a998-4e1e-9bfa-ec015afc123b.png

参考资料

  1. http://stackoverflow.com/questions/949959/why-do-64-bit-dlls-go-to-system32-and-32-bit-dlls-to-syswow64-on-64-bit-windows
  2. http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm
  3. http://blog.csdn.net/fly2leo/article/details/11620273
  4. https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx
  5. https://blogs.msdn.microsoft.com/tianlin/2011/10/26/syswow64/
  6. https://zhuanlan.zhihu.com/p/22311533?refer=jilinxiaohuo

附录
Wow64,全称是32bit Windows On 64bit Windows(64位Windows上的32位Windows)。

你也可以这样理解,虽然整个系统是运行在64位模式,但如果一个应该程序是32位的,Windows会在64位的基础上,加载一个“32位的Windows”。这样,这个32位应用程序就以为自己是运行在32位的系统之上的。

于是,你也可以想象,这就意味着,64位的Windows,不但带有64位操作系统应有的系统文件,还带有32位系统应有的系统文件。

我们都知道的是,Windows系统的主要系统文件都是放在一个叫做System32的文件夹中的。为了能同时放下两套系统文件,Windows会在64位的系统上,增加了一个文件夹,叫SysWow64。

这便有了一个问题,System32和SysWow64里面,哪个放的是64位的系统文件,哪个放的是32位的系统文件呢?

在64位中, System32 存放的是64位的系统文件, SysWow64存放的是32位对应的系统文件。

此外,为了保证32位应用程序不与64位应用程序相冲突,除了System32文件夹外,注册表也需要为32位和64位提供两套,也需要让32位的应用程序在必要时重定向。

你可能感兴趣的:([Windows]在64位的环境,32位的程序调用bat脚本报错)