自動化したり簡単なツールを作る際は、APIではなくシェルコマンドを実行した方が手っ取り早く簡単な事もある。
だが、ShellExecuteでcmd /cで実行するとコンソール画面が出てしまうし、コマンドが終了してから次の処理に進みたい時に面倒である。
そんな時はCreateProcessでウィンドウを隠した状態で実行すれば良い。CreateProcessならば、プロセスの終了をWaitForSingleObjectで待機する事も出来るし、戻り値を取得する事も可能だ。
以下、システムファイル等でAdministrator権限でも操作できないファイルを操作できるようにするtakeownコマンドを呼び出す例に簡単なサンプルコードを記載しておく。
BOOL runcmdproc(CString cmd) { STARTUPINFO si; PROCESS_INFORMATION pi; DWORD ret; HANDLE hWndmain; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; ret = CreateProcess(NULL, cmd.GetBuffer(0), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); hWndmain = pi.hProcess; CloseHandle(pi.hThread); WaitForSingleObject(hWndmain, INFINITE); CloseHandle(hWndmain); return (ret); } BOOL TakeOwn(CString filename) { CString param; param.Format("cmd /c takeown /f \"%s\" && icacls \"%s\" /grant administrators:F",filename,filename); if (runcmdproc(param)) return TRUE; else return FALSE; }
This post is also available in: 英語