我使用Altar' s GetDOSOutput()
(变体1)到this question来通过简单的delphi程序调用dos命令。但是,当CreateProcess调用时,无法找到现有的DOS程序,如DiskPart,而从DOS提示符调用它们时没有问题(Windows server 2003 X64)。可能是什么原因造成的?
命令行:`ListVolumes.bat'
ListVolumes.bat:
path
C:\WINDOWS\SYSTEM32\DiskPart.exe /s ListVolumes.scr
dir C:\WINDOWS\SYSTEM32\DiskPart.exe
通过程序调用输出:
I:\PartScan>path
PATH=C:\WINDOWS;C:\WINDOWS\System32;C:\WINDOWS\System32\wbem;C:\Program Files (x86)\Borland\Delphi7\Bin; C:\Program Files (x86)\Borland\Delphi7\Projects\Bpl\;
I:\PartScan>C:\WINDOWS\SYSTEM32\DiskPart.exe /s ListVolumes.scr
'C:\WINDOWS\SYSTEM32\DiskPart.exe' is not recognized as an internal or external command,
operable program or batch file.
I:\PartScan>dir C:\WINDOWS\SYSTEM32\DiskPart.exe
Volume in drive C is system
Volume Serial Number is 351F-0221
Directory of C:\WINDOWS\SYSTEM32
File Not Found
从DOS提示符调用时输出(注意最后的dir命令):
PATH=C:\WINDOWS;C:\WINDOWS\System32;C:\WINDOWS\System32\wbem;C:\Program Files (x86)\Borland\Delphi7\Bin; C:\Program Files (x86)\Borl
and\Delphi7\Projects\Bpl\;
I:\PartScan>C:\WINDOWS\SYSTEM32\DiskPart.exe /s ListVolumes.scr
Microsoft DiskPart version 5.2.3790.3959
Copyright (C) 1999-2001 Microsoft Corporation.
On computer: ISOETES
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 F DVD-ROM 0 B Healthy
...
Volume 11 G DVD-ROM 0 B Healthy
I:\PartScan>dir C:\WINDOWS\SYSTEM32\DiskPart.exe
Volume in drive C is system
Volume Serial Number is 351F-0221
Directory of C:\WINDOWS\SYSTEM32
17-Feb-2007 08:17 263,680 diskpart.exe
1 File(s) 263,680 bytes
0 Dir(s) 33,111,334,912 bytes free
答案 0 :(得分:3)
您没有显示代码,因此我们无法100%确定地对此进行诊断。但是,可能的原因是您的进程是在WOW64仿真器下运行的32位进程。在模拟器下创建cmd
进程时,您将获得一个32位cmd
进程,该进程也在模拟器下运行。您正在将其与64位进程进行比较。请注意,在模拟器下,文件系统重定向器会将system32
重定向到SysWOW64
。
处理此问题的方法是创建64位进程。从模拟器内部创建时,对cmd
执行操作非常棘手。最简单的方法是从64位进程调用CreateProcess
。
由于您使用Delphi 7,您可能需要使用现代编译器来制作一个小的64位可执行文件,以便为您完成工作。从Delphi 7程序中调用小的可执行文件。
可能符合您需求的替代方法是使用sysnative
别名从模拟器内部到达64位系统目录。这在file system redirector documentation中有所描述。