CreateProcess(A)

新しい 1 個のプロセスと、そのプライマリスレッドを作成します。新しいプロセスは、指定された実行可能ファイルを実行します。

BOOL CreateProcessA(
    PCTSTR pszApplicationName,       // 実行ファイル名
    PTSTR  pszCommandLine,           // コマンドラインパラメータ
    PSECURITY_ATTRIBUTES psaProcess, // プロセスの保護属性
    PSECURITY_ATTRIBUTES psaThread,  // スレッドの保護属性
    BOOL   bInheritHandles,          // オブジェクトハンドル継承のフラグ
    DWORD  fdwCreate,                // 属性フラグ
    PVOID  pvEnvironment,            // 環境変数情報へのポインタ
    PCTSTR pszCurDir,                // 起動時カレントディレクトリ
    LPSTARTUPINFO  psiStartInfo,     // ウィンドウ表示設定
    PPROCESS_INFORMATION ppiProcInfo // プロセス・スレッドの情報
);

KERNEL32.DLL

引数

pszApplicationName

起動する実行可能ファイルのファイル名を表わす文字列のアドレス指定をします。実行可能ファイルとして、 Windows ベースの実行可能モジュールを指定できます。また、適切なサブシステムがローカルコンピュータで利用可能な場合は、他のタイプの実行可能モジュール(例えば、MS-DOS や OS/2 )も指定できます。

ファイル名がフルパスで指定されていないときはカレントディレクトリからロードします。検索パスは使用されません。また、ファイル名に拡張子が含まれていない場合は、 .exe が付加されます。したがってファイル名の拡張子が .com である場合には、拡張子を含めなければいけません。

このパラメータに 0 (NULL) を指定することもできます。このときは pszCommandLine パラメータの最初のトークンを実行ファイル名として扱います。

16ビットのアプリケーションを実行する場合、このパラメータに 0 (NULL) を指定し、pszCommandLine パラメータの最初のトークンに実行可能モジュールのファイル名を指定しなければなりません。

pszCommandLine

コマンドラインパラメータとして新しいプロセスに渡す文字列のアドレスを指定します。

pszApplicationName パラメータに 0 (NULL) が指定されているときはこのパラメータの最初のトークンが実行可能ファイル名として扱われます。この場合、指定した実行可能ファイルがフルパス指定でなければ、アプリケーションがロードされたディレクトリ、カレントディレクトリ、システムディレクトリ、 Windows ディレクトリ、環境変数 PATH で指定されたディレクトリの順に検索し、ロードします。実行ファイル名に拡張子が含まれていない場合は ".EXE" を付加します。ただし、ファイル名の最後が 1 個のピリオド(.)で終わっていて拡張子が含まれていない場合や、ファイル名にパスが含まれている場合には、 ".EXE" は付加されません。

ファイル名に直接パスが含まれていない場合には、以下の順序で実行可能ファイルが検索されます。

  1. アプリケーションがロードされたディレクトリ
  2. 親プロセスのカレントディレクトリ
  3. GetSystemDirectory 関数で取得される32ビットWindowsシステムディレクトリ

    Windows 95/98/Me: Windows システムディレクトリ

  4. 16ビットWindowsシステムディレクトリ
  5. GetWindowsDirectory 関数で取得されるWindowsディレクトリ
  6. PATH 環境変数に含まれるディレクトリ

システムは、コマンドライン文字列をファイル名と引数に分けるためにヌル文字を追加します。これにより、元の文字列が2つの文字列に分割されることになります。

psaProcess

返されるプロセスハンドルを子プロセスへ継承できるようにするかどうかを指定するための SECURITY_ATTRIBUTES 構造体へのポインタを指定します。 0 (NULL) を指定すると、ハンドルは継承されません。

SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバでセキュリティ記述子を設定します。 0 (NULL) を指定するとデフォルトのセキュリティ記述子が使用されます。

psaThread

返されるプライマリスレッドハンドルを子プロセスへ継承できるようにするかどうかを指定するための SECURITY_ATTRIBUTES 構造体へのポインタを指定します。 0 (NULL) を指定すると、ハンドルは継承されません。

SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバでセキュリティ記述子を設定します。 0 (NULL) を指定するとデフォルトのセキュリティ記述子が使用されます。

bInheritHandles

呼び出し側プロセスの持つオブジェクトの継承可能なハンドルを新しいプロセスに継承させるかどうかを指定します。継承させる場合は 1 (TRUE) を、継承させない場合は 0 (FALSE) を指定します。継承されたハンドルは、元のハンドルと同じ値とアクセス権を持ちます。

fdwCreate

プロセスの属性を指定するためのフラグを指定します。

プロセス作成に関する制御フラグを以下の値の組み合わせで指定します。

意味
0x00000001 (DEBUG_PROCESS)

呼び出しプロセスがデバッガのとき使用します。子孫プロセス(デバッグ対象)でデバッグイベントが起こると、親プロセス(デバッガ)に通知されます。

Windows 95/98/Me: 新しいプロセスが16ビットアプリケーションである場合は、このフラグは無効です。

0x00000002 (DEBUG_ONLY_THIS_PROCESS)

このフラグが指定されない場合、かつ、呼び出し側プロセスがデバッグされている場合には、新しいプロセスもまた呼び出し側プロセスのデバッガによるデバッグ対象となります。

0x00000004 (CREATE_SUSPENDED)

新しいプロセスのプライマリスレッドをサスペンド状態で起動します。サスペンド状態のスレッドを実行させるには ResumeThread 関数を使用します。

0x00000008 (DETACHED_PROCESS)

新しいキャラクタベースのプロセスが親プロセスのコンソールウィンドウを利用できないようにします。このフラグを CREATE_NEW_CONSOLE フラグとともに指定することはできません。

0x00000010 (CREATE_NEW_CONSOLE)

新しいプロセスのために新しいコンソールウィンドウを作成します。このフラグを DETACHED_PROCESS フラグとともに指定することはできません。

0x00000200 (CREATE_NEW_PROCESS_GROUPE)

新しいキャラクタベースのプロセスを新しいプロセスグループのルートプロセスにします。プロセスグループには、ルートプロセスの全ての子孫プロセスが含まれます。新しいプロセスグループのプロセスIDは、 ppiProcInfo パラメータで示される PROCESS_INFORMATION 構造体に返されるプロセスIDと同じになります。プロセスグループは、コンソールプロセスのグループに [Ctrl]+[Break] シグナル送信を可能にするために GenerateConsoleCtrlEvent 関数によって使用されます。

このフラグが指定されると、新しいプロセスグループの全てのグループに対する [Ctrl]+[C] シグナルが無効になります。

0x00000400 (CREATE_UNICODE_ENVIRONMENT)

pvEnvironment パラメータの指す環境ブロックが Unicode を使用していることを示します。

Windows 95/98/Me: このフラグはサポートされません。

0x00000800 (CREATE_SEPARATE_WOW_VDM)

このフラグは16ビットWindowsベースのアプリケーションを実行させる場合のみ有効です。新しいプロセスを別個の仮想DOSマシン(VDM)の中で実行させます。このフラグを指定せずに開始される16ビットWindowsベースのアプリケーションはすべて、単一の共有VDMの中でスレッドとして実行されます。

Windows 95/98/Me: このフラグはサポートされません。

0x00001000 (CREATE_SHARED_WOW_VDM)

このフラグは16ビットWindowsベースのアプリケーションを実行させる場合のみ有効です。 WIN.INI の Windows セクション(レジストリの HKEY_LOCAL_MACHINE\ System\CurrentConsoleSet\Control\WOW キー)にある DefaultSeparateVDM スイッチが TRUE に設定されている場合でも、新しいプロセスを共有VDM上で実行させるようにします。

Windows 95/98/Me: このフラグはサポートされません。

0x00002000 (CREATE_FORCEDOS)

16ビット OS/2 アプリケーションに埋め込まれたMS-DOSアプリケーションを強制的に実行させます。

0x01000000 (CREATE_BREAKAWAY_FROM_JOB)

あるジョブに属しているプロセスから起動される子プロセスがそのジョブに属さないようにします。呼び出し側プロセスがジョブに関連付けられていない場合は、このフラグは効果を持ちません。呼び出し側プロセスがジョブに関連付けられている場合はジョブに JOB_OBJECT_LIMIT_BREAKAWAY_OK 制限が設定されている必要があります。

Windows 95/98/Me/NT 4.0 以前: このフラグはサポートされません。

0x04000000 (CREATE_DEFAULT_ERROR_MODE)

新しいプロセスに、呼び出し側プロセスのエラーモードを継承させません。新しいプロセスには、デフォルトのエラーモードを適用します。

0x08000000 (CREATE_NO_WINDOW)

このフラグは16ビットWindowsベースのアプリケーションを実行させる場合のみ有効です。コンソールアプリケーションをコンソールウィンドウなしで実行させます。

Windows 95/98/Me: このフラグはサポートされません。

プロセスの優先度のクラスを以下の値から指定します。指定しない場合は NORMAL_PRIORITY_CLASS になります。ただし、呼び出し側プロセスの優先度が IDLE_PRIORITY_CLASS または BELOW_NORMAL_PRIORITY_CLASS の場合は、それぞれの優先度クラスになります。

優先度
0x00000020 (NORMAL_PRIORITY_CLASS) 通常
0x00000040 (IDLE_PRIORITY_CLASS) アイドル
0x00000080 (HIGH_PRIORITY_CLASS) 優先
0x00000100 (REALTIME_PRIORITY_CLASS) リアルタイム
0x00004000 (BELOW_NORMAL_PRIORITY_CLASS) Windows 2000 以降: 通常以下
0x00008000 (ABOVE_NORMAL_PRIORITY_CLASS) Windows 2000 以降: 通常以上
pvEnvironment

新しいプロセスに渡す環境変数を格納したメモリブロックのアドレスを指定します。 0 (NULL) を指定すると親プロセスのものが使用されます。

環境変数ブロックは1つ以上のヌル文字で区切られた文字列が含まれます。最後の文字列の後ろには2つの連続したヌル文字がなければいけません。それぞれの文字列は

名前=値

の形式になります。環境変数の名前にはセパレータとして使用される「=」(等号)以外の任意の文字を使用することができます。

fdwCreate パラメータに CREATE_UNICODE_ENVIRONMENT フラグが含まれている場合には、環境変数ブロックにはUnicode文字列を格納します。それ以外の場合にはANSI文字列を格納します。

pszCurDir

新しいプロセスの起動時のカレントディレクトリの文字列のアドレスを指定します。この文字列は、ドライブ文字を含めたフルパスで指定しなければいけません。このパラメータに 0 (NULL) を指定すると親プロセスのカレントディレクトリになります。

psiStartInfo

起動する際の情報を格納した STARTUPINFO 構造体のアドレスを指定します。

ppiProcInfo

起動したプロセスについての情報を格納する PROCESS_INFORMATION 構造体のアドレスを指定します。

戻り値

成功すると 0 以外の値が返ります。

失敗すると 0 が返ります。拡張エラー情報を取得するには、 GetLastError 関数を使います。

解説

ppiProcInfo パラメータで示される PROCESS_INFORMATION 構造体に格納されたプロセスハンドルとスレッドハンドルは不要になったら CloseHandle 関数で破棄しなければなりません。

プロセスおよびスレッドには、それぞれ32ビットのプロセス ID およびスレッド ID が割り当てられます。これらの値は PROCESS_INFORMATION 構造体に格納されます。プロセス ID はプロセスが終了するまで、スレッド ID はスレッドが終了するまで、すべてのプロセスで有効です。

対応情報

Windows 95 以降 / Windows NT 3.1 以降