c++で他のアプリケーションを呼び出す方法(winexec shellexecute createprocess)

3679 ワード

3つのWINDOWS SDK関数:WinExec,ShellExecute,CreateProcessは、他のプログラムを呼び出すための要件を実現します.
WinExec
この関数は最も簡単で、2つのパラメータしかありません.プロトタイプは以下の通りです.
       UINT WinExec(
       LPCSTR lpCmdLine,   //コマンドパス
       UINT uCmdShow      //表示方法
      ;
使用方法は次のとおりです.
WinExec("Notepad.exe", SW_SHOW);  //手帳を広げる
WinExec("D:""Program Files""Test""Test.exe",SW_SHOWMAXIMIZED);//Test.exeを最大化して開く
注意:MSはこのAPIを推奨しません.Below words is from MSDN:
Note  This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function. if you must use WinExec for legacy reasons, make sure the application name is enclosed in quotation marks as shown in the example below. WinExec("""C:""Program Files""MyApp.exe"" -L -S", ...)
ShellExecute
プロトタイプは次のとおりです.
       HINSTANCE ShellExecute(
       HWND hwnd,          //親ウィンドウハンドル
       LPCTSTR lpOperation,   //操作、開き方「edit」、「explore」、「open」、「find」、「print」、「NULL」
       LPCTSTR lpFile,         //ファイル名、前にパスを追加
       LPCTSTR lpParameters,   //パラメータ
       LPCTSTR lpDirectory,   //デフォルトフォルダ
       INT nShowCmd          //表示方法
);
使用方法は次のとおりです.
ShellExecute(NULL,「open」,「C:」「Test.txt」,NULL,NULL,SW_SHOWNORMAL);//C:「Test.txtファイル」を開く
ShellExecute(NULL, "open", "::URL::http://www.google.com「,/NULL,NULL,SW_SHOWNORMAL);//ホームページwww.google.comを開く
ShellExecute(NULL,“explore”,“D:”“C++”,NULL,NULL,SW_SHOWNORMAL);//ディレクトリDを開く:“C++
ShellExecute(NULL,“print”,“C:”“Test.txt”,NULL,NULL,SW_HIDE);//印刷ファイルC:“Test.txt”
ShellExecuteでは指向性出力はサポートされていません.
CreateProcess 
Use below function directly:
///////////////////////////////////////////////////////////////////////////////////ExecApp()////Purpose:     Runs the specified application (replacement for WinExec)////Parameters:  lpszCommandLine - [in] command line (including exe filepath) //                                that is passed to CreateProcess()//              wShowCmd        - [in] Specifies how app window is to be shown.//                                See ShowWindow() in MSDN for possible values.////Returns:     BOOL            - TRUE = CreateProcess() succeeded//BOOL ExecApp(LPCTSTR lpszCommandLine, WORD wShowCmd/*= SW_SHOWNORMAL*/) {     BOOL rc = FALSE;     if (lpszCommandLine && (lpszCommandLine[0] != _T('"0')))     {         STARTUPINFO si = { 0 };         si.cb = sizeof(si);         si.dwFlags = STARTF_USESHOWWINDOW;         si.wShowWindow = wShowCmd;         PROCESS_INFORMATION pi = { 0 };         rc =::CreateProcess(NULL, (LPTSTR)lpszCommandLine, NULL, NULL, FALSE,                  NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);         TRACE(_T("CreateProcess returned %d for <%s>"n"), rc, lpszCommandLine);         //close process and thread handles now (app will continue to run)         if (pi.hProcess)             ::CloseHandle(pi.hProcess);         if (pi.hThread)             ::CloseHandle(pi.hThread);     }     return rc;
}
この3つの関数を使用するには、いくつかの注意点があります.
      1、ヘッダファイルの定義
      ヘッダファイルstdafx.hでは、次の2つのヘッダファイルを定義する必要があります.
      #include // 置換可能 windows.h       #include        ヘッダファイルが定義されている場合 #includeなら#includeを定義する必要はありません.「windows.h」には「shellapi.h」だけでなく、多くのデータ型が定義されています.これらのデータ型がなければ、shellapi.h自体がエラーになります.        2、パスの定義
    C++で表されるパスは、通常の「」ではなく「」「」で表されるので、上記の3つの関数はパスを表します.
Disk:""Directory""...""File name