CreateProcess(A)

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

BOOL CreateProcessA(
    PCTSTR pszApplicationName,       // module name
    PTSTR  pszCommandLine,           // command line
    PSECURITY_ATTRIBUTES psaProcess, // process attributes
    PSECURITY_ATTRIBUTES psaThread,  // thread attributes
    BOOL   bInheritHandles,          // interit flag
    DWORD  fdwCreate,                // priority and creation flags
    PVOID  pvEnvironment,            // environment blocks
    PCTSTR pszCurDir,                // current directory
    LPSTARTUPINFO  psiStartInfo,     // startup information
    PPROCESS_INFORMATION ppiProcInfo // process information
);

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)

直ちに実行されなければならないタイムクリティカルなタスクを実行するプロセスです。このプロセスのスレッドは、通常クラスやアイドルクラスのプロセスに属するスレッドより優先して実行されます。このクラスのアプリケーションはほぼすべてのCPU空き時間を占有可能となるため、このクラスを指定する場合は十分に注意する必要があります。

0x00000100 (REALTIME_PRIORITY_CLASS)

最も高い優先順位クラスを持つプロセスです。このプロセスのスレッドは、重要なタスクを実行しているオペレーティングシステムのプロセスを含む、他のすべてのプロセスに属するスレッドのより優先して実行されます。

0x00004000 (BELOW_NORMAL_PRIORITY_CLASS)

IDLE_PRIORITY_CLASSより高くNORMAL_PRIORITY_CLASSより低い優先度を持つプロセスです。

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

0x00008000 (ABOVE_NORMAL_PRIORITY_CLASS)

NORMAL_PRIORITY_CLASSより高くHIGH_PRIORITY_CLASSより低い優先度を持つプロセスです。

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

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はスレッドが終了するまで、すべてのプロセスで有効です。

呼び出しプロセスは、WaitForInputIdle関数を使用して、新しいプロセスが初期化を終了してユーザー入力の待機状態になるまで待つことができます。これは、親プロセスと子プロセスの間で同期を取るのに役立ちます。

対応情報

Windows 95 以降 / Windows NT 3.1 以降