2014-11-15 2 views
-2

Я использую Altar's GetDOSOutput() (вариант 1) до this question для вызова dos-команд с помощью простой программы delphi. Тем не менее, существующая программа DOS, такая как DiskPart, не может быть найдена при вызове CreateProcess, тогда как при вызове из DOS-запроса (Windows Server 2003 X64) они не представляют проблем. Что может быть причиной этого?Почему cmd.exe в CreateProcess ведет себя отличным от DOS-подсказки?

командной строки: `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 
+5

Было бы здорово, если бы мы могли перестать звонить в консольные приложения DOS-программ. DOS больше нет. –

+0

Вернее, DOS все еще существует, но большая часть того, что называется DOS, действительно нет. – hvd

+1

Решение прост, используйте папку [Sysnative] (http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm) вместо каталога system32 ... – whosrdaddy

ответ

3

Вы не показали код, поэтому мы не можем диагностировать его со 100% уверенностью. Однако вероятная причина заключается в том, что ваш процесс представляет собой 32-битный процесс, выполняемый под эмулятором WOW64. Когда вы создаете процесс cmd под эмулятором, вы получаете 32-разрядный процесс cmd, также работающий под эмулятором. Вы сравниваете это с 64-битным процессом. Обратите внимание, что под эмулятором system32 перенаправляется на SysWOW64 файловым редиректором.

Способ, которым вы имеете дело с этим, заключается в создании 64-битного процесса. Это довольно сложно сделать для cmd при создании изнутри эмулятора. Самый простой способ сделать это - вызвать CreateProcess из 64-битного процесса.

Поскольку вы используете Delphi 7, вам может понадобиться использовать современный компилятор для создания небольшого 64-битного исполняемого файла, который будет работать для вас. Позвоните в маленький исполняемый файл из вашей программы Delphi 7.

Альтернативой, которая может соответствовать вашим потребностям, является использование псевдонима sysnative для доступа к 64-разрядному системному каталогу изнутри эмулятора. Это описано в file system redirector documentation.

+0

Код копируется и вставляется с http://stackoverflow.com/questions/1454501/how-do-i-run-a-command-line-program-in-delphi. – user508402

+0

Это действительно проблема. Тот же программный код, составленный XE2/64, работает так, как ожидалось. Спасибо. – user508402

+0

ОК, но мы не видим, как вы его назвали. Поэтому всегда полезно давать MCVE. –

Смежные вопросы