2010-12-03 15 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コマンド –

+0

とではありません。 DOSは現代のWindowsシステムの一部ではありません。 "dir"はコマンドラインコマンドまたはシステムコマンドです。 –

+0

また、 'SW_SHOWNORMAL'を使うべきです。 –

答えて

3

コマンド文字列の前に何かが必要です。

/cが - それは

/Kを実行するようになります - それはあなたがそのようなコマンドを実行するためのシェルを作成する必要がない

2

をやったときに消え実行していないことになります。これはコンソール実行可能で、CreateProcess()で直接実行できます。シェルを呼び出すとは、実行可能ファイル(cmd.exe)を起動して、それを直接起動したのと同じ方法で起動します。 1つではなく2つのプロセスを作成するだけです。 IMHOはプログラミングの習慣が悪いので、Windowsの仕組みには手がかりがないことを示すだけです)

2

使用しているOSはどれですか?私はこのようなコマンドは、XPの後の任意のWindowsプラットフォームで高度が必要であると確信しています。

は、ここでも "DIR" である私は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; 
+0

こんにちは、ポストXPのOSにcommnadの行引数で実行する管理者権限が必要かどうかを確認しましたか?私のユーザーが管理者アカウントにログインしていない可能性があるだけに興味があります。 – Noitidart

関連する問題