0

我正在尝试C:\Windows\System32...通过使用运行批处理文件将文件从 VC++复制到ShellExecute,这就是我的批处理文件运行的内容

xcopy /S/E "source" "C:\Windows\System32\test.dll" /y

问题是当我从 VC++ 运行这个批处理文件时,它会被复制到C:\Windows\SysWOW64,但是当我双击批处理文件时,它会复制到我想要的位置C:\Windows\System32...

我应该怎么做才能让它System32从 VC++ 复制到?

4

2 回答 2

1

首先我必须说,从可执行文件运行批处理文件只是为了复制文件太笨拙且效率低下。复制文件的 API 有很多,否则怎么xcopycopy?您只需要调用适当的类似CopyFileCopyFileExW。在从可执行文件运行任何外部命令之前,请始终在 MSDN 中搜索 API,总有更好的解决方案

请参阅如何使用 C++ 在 Windows 中复制和粘贴文件?


回到问题,那是因为文件系统重定向器。如果您将程序编译为 32 位,那么该 *.bat 文件将在 32 位 cmd.exe 中运行。但是当您双击它时,将执行 64 位 cmd.exe,这就是为什么您会看到这样的结果。

如果您不需要支持 32 位平台,您可以将程序编译为 64 位。如果您必须将程序编译为 32 位,则需要禁用 MS 网站上提到的文件系统重定向,或使用%windir%\SysNative

但不需要像那样运行批处理文件,直接从 cmd.exe 运行即可。以下命令

cmd /c xcopy /S/E "source" "C:\Windows\System32\test.dll*" /y

将在/c. 确保运行正确的 32 位或 64 位版本的 cmd

在 32 位程序中,如果您不禁用文件系统重定向,那么您需要使用正确的文件夹运行正确版本的 cmd.exe。使用以下命令运行 32 位 cmd.exe

system("cmd.exe /c xcopy /S/E \"source\" \"%windir%\\Sysnative\\test.dll*\" /y"); // or
system(R"(cmd.exe /c xcopy /S/E "source" "%windir%\Sysnative\test.dll*" /y)")

或以下运行 64 位 cmd

system("%windir%\\Sysnative\\cmd.exe /c xcopy /S/E \"source\" \"%windir%\\System32\\test.dll*\" /y"); // or
system(R"(%windir%\Sysnative\cmd.exe /c xcopy /S/E "source" "%windir%\System32\test.dll*" /y)");

最简单的方法是将项目更改为 64 位并正常运行

system("xcopy /S/E \"source\" \"%windir%\\System32\\test.dll*\" /y"); // or
于 2013-09-27T09:21:50.223 回答
0

检查两个重要方面:

  • 你的应用程序是 32 位还是 64 位进程?
  • 当前目录

还要确保您可能需要注释掉REM标记的行、处理环境变量等。

于 2013-09-27T08:25:57.467 回答