2010-12-03 4 views
1

Я пытаюсь запустить команду из командной строки из моего приложения Delphi.Delphi Выполнение команды командной строки

ShellExecute(Form1.Handle, 
      'open', 
      'cmd.exe', 
      'icacls "C:\ProgramData\My Program\File" /grant Users:F', 
      nil, 
      SW_NORMAL); 

Примечание: команда сама работает отлично.

Однако, когда я запускаю этот код в Delphi, я получаю окно команды, но команда, которую я хочу выполнить, не запускается и даже не появляется в окне команд.

Любая идея относительно того, чего я не хватает?

+2

CACLS не команда DOS – 2010-12-03 14:58:20

+0

И даже не «реж» есть. DOS не является частью современной системы Windows. «dir» - это команда командной строки или системная команда. – 2010-12-03 14:59:56

ответ

3

Командная строка нуждается в чем-то перед ней.

/с - заставит его работать

/к - заставит его бежать и не исчезают, когда сделано

2

У вас нет необходимости создавать оболочку для запуска такой команды. Это консольный исполняемый файл, и вы можете запустить его напрямую с помощью CreateProcess(). Вызов оболочки просто означает вызывать исполняемый файл (cmd.exe) и вызывать его более или менее так же, как вы его вызывали бы напрямую. Вы просто тратите время на создание двух процессов вместо одного. ИМХО, это плохая практика программирования, и просто показывает, что вызывающий абонент не знает, как работает Windows;)

2

Какая ОС вы используете? Я уверен, что такая команда требует повышения на любой платформе Windows после XP.

Вот код, который я использую для повышения процесса под Vista/Windows 7

uses 
    Windows, ShellAPI, Registry; 

type 
    TExecuteFileOption = (
    eoHide, 
    eoWait, 
    eoElevate 
); 
    TExecuteFileOptions = set of TExecuteFileOption; 

... 

function IsUACActive: Boolean; 
var 
    Reg: TRegistry; 
begin 
    Result := FALSE; 

    if CheckWin32Version(6, 0) then 
    begin 
    Result := FALSE; 

    Reg := TRegistry.Create; 
    try 
     Reg.RootKey := HKEY_LOCAL_MACHINE; 

     if Reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System') then 
     begin 
     if (Reg.ValueExists('EnableLUA')) and (Reg.ReadBool('EnableLUA')) then 
      Result := TRUE; 
     end; 
    finally 
     FreeAndNil(Reg); 
    end; 
    end; 
end; 

function ExecuteFile(Handle: HWND; const Filename, Paramaters: String; Options: TExecuteFileOptions): Integer; 
var 
    ShellExecuteInfo: TShellExecuteInfo; 
    ExitCode: DWORD; 
begin 
    Result := -1; 

    ZeroMemory(@ShellExecuteInfo, SizeOf(ShellExecuteInfo)); 
    ShellExecuteInfo.cbSize := SizeOf(TShellExecuteInfo); 
    ShellExecuteInfo.Wnd := Handle; 
    ShellExecuteInfo.fMask := SEE_MASK_NOCLOSEPROCESS; 

    if (eoElevate in Options) and (IsUACActive) then 
    ShellExecuteInfo.lpVerb := PChar('runas'); 

    ShellExecuteInfo.lpFile := PChar(Filename); 

    if Paramaters <> '' then 
    ShellExecuteInfo.lpParameters := PChar(Paramaters); 

    // Show or hide the window 
    if eoHide in Options then 
    ShellExecuteInfo.nShow := SW_HIDE 
    else 
    ShellExecuteInfo.nShow := SW_SHOWNORMAL; 

    if ShellExecuteEx(@ShellExecuteInfo) then 
    Result := 0; 

    if (Result = 0) and (eoWait in Options) then 
    begin 
    GetExitCodeProcess(ShellExecuteInfo.hProcess, ExitCode); 

    while (ExitCode = STILL_ACTIVE) and 
      (not Application.Terminated) do 
    begin 
     sleep(50); 

     GetExitCodeProcess(ShellExecuteInfo.hProcess, ExitCode); 
    end; 

    Result := ExitCode; 
    end; 
end; 
Смежные вопросы