unit CreateProcessUnit; interface uses Windows, SysUtils, uses_end; procedure EasyCreateProcess(ExeName: String; Argument: String = ''; CurrentDirectory: String = ''; Modal: Boolean = False; Show: Boolean = True); overload; procedure EasyCreateProcessCmd(CommandLine: String; Modal: Boolean = False; Show: Boolean = True); procedure testEasyCreateProcessCmd; implementation {------------------------------- // ファイルかフォルダの存在を確認します 備考: 履歴: 2004/11/06 //------------------------------} function FileFolderExists(FileFolderName: String): Boolean; begin if FileExists(FileFolderName) then begin Result := True; Exit; end else if DirectoryExists(FileFolderName) then begin Result := True; Exit; end else begin Result := False; end; end; //------------------------------ {------------------------------- // EasyCreateProcess 機能: CreateProcessを簡単に呼び出します 備考: コマンドラインを呼び出す場合、ExeやTargetFile指定するときに スペースを含むパスの場合は["]で囲む必要があるので、 関数内部でAnsiQuotedStrを使っています notepadを呼び出す時はExeNameに[notepad.exe]と指定しよう [notepad]と指定するとTargetFile指定が正しく受け付けてくれません 参考:[Delphi-ML:21800] Re: DOS の画面を表示させない方法 履歴: 2004/02/17 AnsiQuateStrでパスを囲った 2004/05/16 overloadしてコマンドラインを直接呼ぶ機能もつけた 2005/05/03 overloadはやめてCurrentDir指定引数を追加 2006/12/23(土) EasyCreateProcessCmdはファイル名を指定しただけでは 動かない気がする。 //------------------------------} procedure EasyCreateProcess(ExeName: String; Argument: String = ''; CurrentDirectory: String = ''; Modal: Boolean = False; Show: Boolean = True); overload; var si: TStartupInfo; pi: TProcessInformation; begin FillChar(si, Sizeof(TStartupInfo), 0); si.cb := Sizeof(TStartupInfo); if not Show then with si do begin cb := SizeOf(si); lpReserved := nil; lpDesktop := nil; lpTitle := nil; dwX := 0; dwY := 0; dwXSize := 0; dwYSize := 0; dwXCountChars := 0; dwYCountChars := 0; dwFillAttribute := 0; dwFlags:= STARTF_USESHOWWINDOW; // DOS プロンプトが表示 wShowWindow := SW_HIDE; // されるのを抑止する // dwFlags := STARTF_USESHOWWINDOW; // wShowWindow := SW_SHOWMINIMIZED or SW_HIDE; end; if FileFolderExists(Argument) then begin Argument := ' ' + AnsiQuotedStr(Argument, '"'); end else if not (Argument = '') then begin Argument := ' ' + Argument; end; if (CurrentDirectory = '') or (not DirectoryExists(CurrentDirectory)) then begin CreateProcess(nil, PChar(AnsiQuotedStr(ExeName, '"') + Argument), nil, nil, True, 0, nil, nil, si, pi); end else begin CreateProcess(nil, PChar(AnsiQuotedStr(ExeName, '"') + Argument), nil, nil, True, 0, nil, PChar(CurrentDirectory), si, pi); end; if Modal then WaitForSingleObject(pi.hProcess, INFINITE) {起動したプロセスが終了するのを待つ命令 待っている間は実行が停止する} end; procedure EasyCreateProcessCmd(CommandLine: String; Modal: Boolean = False; Show: Boolean = True); var si: TStartupInfo; pi: TProcessInformation; begin FillChar(si, Sizeof(TStartupInfo), 0); si.cb := Sizeof(TStartupInfo); if not Show then with si do begin cb := SizeOf(si); lpReserved := nil; lpDesktop := nil; lpTitle := nil; dwX := 0; dwY := 0; dwXSize := 0; dwYSize := 0; dwXCountChars := 0; dwYCountChars := 0; dwFillAttribute := 0; dwFlags:= STARTF_USESHOWWINDOW; // DOS プロンプトが表示 wShowWindow := SW_HIDE; // されるのを抑止する // dwFlags := STARTF_USESHOWWINDOW; // wShowWindow := SW_SHOWMINIMIZED or SW_HIDE; end; CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, si, pi); if Modal then WaitForSingleObject(pi.hProcess, INFINITE) {起動したプロセスが終了するのを待つ命令 待っている間は実行が停止する} end; procedure testEasyCreateProcessCmd; begin EasyCreateProcess('notepad'); EasyCreateProcess('C:\WINDOWS\system32\notepad.exe'); EasyCreateProcessCmd('C:\Program Files\Internet Explorer\IEXPLORE.EXE'); EasyCreateProcessCmd('C:\Program Files\Windows NT\Accessories\wordpad.exe'); end; //------------------------------ end.