我在执行命令行时遇到了一个非常奇怪的问题。下面的代码工作正常,没有问题:
ShellExecute(NULL, "open", "cmd.exe", "/C ipconfig > file_output.txt", NULL, SW_SHOWNORMAL);在执行时,ipconfig输出被写入file_output.txt",这正是我想要的。
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);生成文件,但文件中没有任何内容。我可以在cmd.exe中执行与管理员相同的命令,它可以工作。我也试过:
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit /enum all > file_output.txt", NULL, SW_SHOWNORMAL);bcdedit不起作用。没有错误。下面是我尝试过的一些其他方法:
同样,在cmd.exe中执行相同的命令是有效的,但在我的代码中似乎不起作用。我找了一整天,似乎找不到有用的东西。有什么想法吗?
编辑:经过进一步的调试,现在我看到了下面的命令。
“‘bcdedit”不被识别为内部或外部命令、可操作的程序或批处理文件。 “C:\Windows\System32\bcdedit.exe”不被识别为内部或外部的c ommand、可操作的程序或批处理文件。
我再次尝试了上面列出的所有4种方法,显然它仍然不能被识别为命令。**bcdedit.exe实际上存在于C:\Windows\System32 32**中。
发布于 2018-06-13 11:02:15
这就是在64位窗口上运行的32位进程的文件系统重定向的效果。
在64位窗口上,每当32位应用程序试图访问%windir%\System32目录时,访问将被重定向到%windir%\SysWOW64。这个过程对应用程序是透明的,它仍然认为它在访问%windir%\System32目录。
因此,当您的32位应用程序调用cmd.exe时,它实际上是调用驻留在%windir%\SysWOW64中的32位版本的cmd.exe。32位版本的cmd.exe依次尝试从SysWOW64目录调用bcdedit.exe,但在%windir%\SysWOW64中没有32位版本的bcdedit.exe,只有32位cmd.exe无法访问的%windir%\System32中才存在。
要获得有关文件系统重定向器的更多信息,可以参考https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx上的MSDN页面
解决这个问题的最方便的方法是将应用程序编译为64位可执行文件,以便在64位窗口上运行。
但是,如果您有只保留32位应用程序的特定需求,或者如果您想拥有一个可以同时在32位和64位系统上运行的可执行文件,那么您可以暂时禁用文件系统重定向器,以便能够在64位窗口上运行64位版本的cmd.exe。关于如何做到这一点的信息可以在上面发布的链接中找到。
但一般不建议这样做,它需要通过对主题的理解,它有可能产生比它解决更多的问题。
如果需要32位和64位窗口的单一可执行文件,则可以同时生成32位和64位版本的应用程序,并将64位可执行文件嵌入32位可执行文件中作为资源。然后32位应用程序可以检测它是在32位还是64位窗口下运行,所以它要么继续运行,要么将64位可执行文件提取到临时位置来运行。
发布于 2018-06-12 19:15:54
好吧。我认为您的应用程序是以管理员身份运行的,但是ShellExecute命令不是。要做到这一点,我相信您需要向runas而不是open提出第二个论点。如下所示:
ShellExecute(NULL, "runas", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);https://stackoverflow.com/questions/50824048
复制相似问题