CreateProcess

https://msdn.microsoft.com/ja-jp/library/cc429803.aspx https://msdn.microsoft.com/ja-jp/library/cc429838.aspx https://msdn.microsoft.com/ja-jp/library/aa379560.aspx https://msdn.microsoft.com/ja-jp/library/aa379560.aspx https://msdn.microsoft.com/ja-jp/library/cc428987.aspx https://msdn.microsoft.com/ja-jp/library/cc429265.aspx https://msdn.microsoft.com/ja-jp/library/cc429065.aspx https://msdn.microsoft.com/ja-jp/library/cc429163.aspx https://msdn.microsoft.com/ja-jp/library/ms686331.aspx https://msdn.microsoft.com/ja-jp/library/ms684873.aspx https://msdn.microsoft.com/ja-jp/library/cc428944.aspx https://msdn.microsoft.com/ja-jp/library/ms684873.aspx https://msdn.microsoft.com/ja-jp/library/cc429605.aspx https://msdn.microsoft.com/ja-jp/library/cc429325.aspx https://msdn.microsoft.com/ja-jp/library/cc429163.aspx https://msdn.microsoft.com/ja-jp/library/cc429605.aspx https://msdn.microsoft.com/ja-jp/library/cc429265.aspx https://msdn.microsoft.com/ja-jp/library/cc429325.aspx https://msdn.microsoft.com/ja-jp/library/cc429803.aspx https://msdn.microsoft.com/ja-jp/library/cc429838.aspx https://msdn.microsoft.com/ja-jp/library/ms684873.aspx https://msdn.microsoft.com/ja-jp/library/aa379560.aspx https://msdn.microsoft.com/ja-jp/library/cc429733.aspx https://msdn.microsoft.com/ja-jp/library/cc428987.aspx https://msdn.microsoft.com/ja-jp/library/ms686331.aspx https://msdn.microsoft.com/ja-jp/library/cc429065.aspx

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

異なったセキュリティコンテキストで動作するプロセスを作成するには、CreateProcessAsUser または CreateProcessWithLogonW 関数を使ってください。

BOOL CreateProcess(
  LPCTSTR lpApplicationName,                 // 実行可能モジュールの名前
  LPTSTR lpCommandLine,                      // コマンドラインの文字列
  LPSECURITY_ATTRIBUTES lpProcessAttributes, // セキュリティ記述子
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // セキュリティ記述子
  BOOL bInheritHandles,                      // ハンドルの継承オプション
  DWORD dwCreationFlags,                     // 作成のフラグ
  LPVOID lpEnvironment,                      // 新しい環境ブロック
  LPCTSTR lpCurrentDirectory,                // カレントディレクトリの名前
  LPSTARTUPINFO lpStartupInfo,               // スタートアップ情報
  LPPROCESS_INFORMATION lpProcessInformation // プロセス情報
);

パラメータ

lpApplicationName
実行するべきモジュールの名前を保持している、NULL で終わる文字列へのポインタを指定します。

この文字列で、実行するべきモジュールのフルパスとファイル名、または部分的な名前を指定できます。部分的な名前を指定した場合、この関数は、カレントドライブとカレントディレクトリを使ってファイル指定を完成させます。この関数は、検索パスを利用しません。

lpApplicationName パラメータで NULL を指定することもできます。この場合、lpCommandLine 文字列の最初のトークンでモジュール名を指定してください。トークンとは、半角スペースで区切られた単語を意味します。長いファイル名の一部として半角スペースを使っている場合、引用符を使ってファイル名を囲み、ファイル名の終了位置と引数の開始位置を明示してください。さもないと、ファイル名があいまいになります。たとえば、"c:\program files\sub dir\program name" というファイル名について考えてみましょう。この文字列には、数とおりの解釈方法があります。システムは、次の順序で可能性を考慮します。

c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe

モジュールとして、Win32 ベースのアプリケーションを指定できます。また、適切なサブシステムがローカルコンピュータで利用する場合は、他のタイプのモジュール(たとえば、MS-DOS や OS/2)も指定できます。

Windows NT/2000:16 ビットのアプリケーションを実行する場合、このパラメータで NULL を指定してください。lpCommandLine 文字列では、最初にモジュール名に、次にそのモジュールの引数を指定してください。16 ビットアプリケーションとは、VDM(Virtual DOS Machine)プロセスまたは WOW(Windows on Windows;32 ビット環境での 16 ビット Windows アプリケーションのサンク)プロセスで実行されるものを意味します。

lpCommandLine
実行するべきコマンドラインを保持している、NULL で終わる文字列へのポインタを指定します。システムはこのコマンドラインの最後に NULL を追加し、必要に応じて文字列を切り捨て、実際にどのファイルを使うのか指定します。

Windows NT/2000:このパラメータで const 文字列(リテラル;文字列定数)を指定すると、この関数の Unicode 版である CreateProcessW 関数は失敗します。

lpCommandLine パラメータで NULL を指定することもできます。この場合、lpApplicationName パラメータで指定した文字列がコマンドラインとして扱われます。

lpApplicationName lpCommandLine の両方のパラメータで NULL 以外の値を指定すると、*lpApplicationName は実行するべきモジュール名、*lpCommandLine はコマンドラインを意味します。新しいプロセスは GetCommandLine 関数を使って、コマンドライン全体を取得できます。C のランタイムプロセスは、argc argv の各引数を利用できます。コマンドラインの最初のトークンとしてモジュール名を再度指定するのは、一般的な慣習です。

lpApplicationName パラメータで NULL を指定した場合、コマンドラインのうち、最初の半角スペースで区切られたトークン(最初の半角スペースより左側)がモジュール名を意味します。長いファイル名の一部として半角スペースを使っている場合、引用符を使ってファイル名を囲み、ファイル名の終了位置と引数の開始位置を明示してください(この関数の lpApplicationName パラメータの説明を参照してください)。ファイル名の一部として拡張子を指定しなかった場合、.exe が追加されます。ファイル名の最後が 1 個のピリオド(.)で終わっていて拡張子が含まれていない場合や、ファイル名にパスが含まれている場合、.exe は追加されません。ファイル名にパスが含まれていなかった場合、Windows は次の順序で実行可能ファイルを検索します。

1.アプリケーションのロードに使ったディレクトリ(アプリケーションの実行可能ファイルと同じディレクトリ)

2.親プロセスのカレントディレクトリ

3.Windows 95/98:Windows のシステムディレクトリ。このディレクトリのパスは、 関数で取得できます。

Windows NT/2000:32 ビットの Windows システムディレクトリ。このディレクトリのパスは、GetSystemDirectory 関数で取得できます。このディレクトリの既定の名前は、SYSTEM32 です。

4.Windows NT/2000:16 ビットの Windows システムディレクトリ。このディレクトリのパスを取得する Win32 関数はありませんが、SearchPath 関数の検索対象になります。このディレクトリの既定の名前は、SYSTEM です。

5.Windows ディレクトリ。このディレクトリのパスは、 関数で取得できます。

6.環境変数 PATH に記述されている各ディレクトリ

7.Windows 95/98:32 ビットの Windows システムディレクトリ。このディレクトリのパスは、GetSystemDirectory 関数で取得できます。このディレクトリの既定の名前は、SYSTEM32 です。

lpProcessAttributes
1 個の 構造体へのポインタを指定します。この構造体で、子プロセスが、取得したハンドルを継承できるかどうかを指定します。このパラメータで NULL を指定すると、取得したハンドルを継承できません。

Windows NT/2000:SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバで、新しいプロセスに適用されるセキュリティ記述子を指定します。このパラメータで NULL を指定すると、既定のセキュリティ記述子がプロセスに適用されます。

lpThreadAttributes
1 個の 構造体へのポインタを指定します。この構造体で、子プロセスが、取得したハンドルを継承できるかどうかを指定します。このパラメータで NULL を指定すると、取得したハンドルを継承できません。

Windows NT/2000:SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバで、メインスレッドに適用されるセキュリティ記述子を設定します。このパラメータで NULL を指定すると、既定のセキュリティ記述子がメインスレッドに適用されます。

bInheritHandles
新しいプロセスが、呼び出し側プロセスのハンドルを継承するかどうかを指定します。TRUE を指定すると、呼び出し側プロセス内で開いている、継承可能なハンドルは、新しいプロセスへ継承されます。継承されたハンドルは、元のハンドルと同じ値とアクセス権を持ちます。
dwCreationFlags
優先順位クラスとプロセスの作成を制御するフラグを指定します。プロセス作成に関する制御フラグは、特に注意がない場合、次の値の任意の組み合わせで指定できます。
意味
CREATE_BREAKAWAY_FROM_JOBWindows 2000:あるプロセスが特定のジョブに関連付けられている場合でも、その子プロセスをそのジョブに関連付けません。

呼び出し側プロセスがどのジョブにも関連付けられていない場合、このフラグには意味はありません。呼び出し側が特定のオブジェクトに関連付けられている場合、そのオブジェクトは JOBOBJECT_BASIC_LIMIT_INFORMATION 構造体の LimitFlags メンバで JOB_OBJECT_LIMIT_BREAKAWAY_OK を指定しなければなりません。さもないと、CreateProcess 関数は失敗します。

CREATE_DEFAULT_ERROR_MODE新しいプロセスは、呼び出し側プロセスのエラーモードを継承しません。代わりに、CreateProcess 関数は新しいプロセスに、現在の既定のエラーモードを割り当てます。アプリケーションは 関数を呼び出すことにより、現在の既定のエラーモードを設定できます。

マルチスレッド化されたシェルアプリケーションが、ハードエラーを無効にして動作する場合、このフラグは特に役立ちます。

CreateProcess 関数の既定の動作では、新しいプロセスは、呼び出し側のエラーモードを継承します。このフラグを指定すると、この既定の動作は無効になります。

CREATE_FORCE_DOSWindows NT/2000:このフラグは、16 ビット版のアプリケーションを起動する場合にのみ有効です。このフラグを指定すると、システムはアプリケーションを強制的に、OS/2 ベースのアプリケーションではなく MS-DOS ベースのアプリケーションとして動作させます。
CREATE_NEW_CONSOLE新しいプロセスは、親のコンソールを継承せず、新しいコンソールを持ちます。DETACHED_PROCESS フラグと同時に指定することはできません。
CREATE_NEW_PROCESS_GROUP新しいプロセスを、新しいプロセスグループのルートプロセスにします。このルートプロセスのすべての子孫プロセスは、このプロセスグループを形成します。新しいプロセスグループのプロセス識別子は、lpProcessInformation パラメータに格納されたプロセス識別子と同じ値です。 関数はプロセスグループを使って、Ctrl+C または Ctrl+Break の信号を、複数のコンソールプロセスからなるグループへ送信します。
CREATE_NO_WINDOWWindows NT/2000:このフラグは、コンソールアプリケーションを起動する場合にのみ有効です。このフラグを指定すると、コンソールウィンドウなしでアプリケーションを実行します。
CREATE_SEPARATE_WOW_VDMWindows NT/2000:このフラグは、16 ビット版 Windows ベースのアプリケーションを起動する場合にのみ有効です。このフラグを指定すると、新しいプロセスはプライベート VDM(仮想 DOS マシン)内で動作します。既定では、16 ビット版 Windows ベースのすべてのアプリケーションが 1 つの共有 VDM 内で動作します。これらのアプリケーションを個別に動作させると、どれか 1 つのアプリケーションがクラッシュした場合でも、1 つの VDM が終了するだけで済むという利点があります。他の VDM 内で動作している他のすべてのプログラムは、正常に動作を続けます。また、16 ビット版 Windows ベースのアプリケーションを個別の VDM 内で動作させると、個別の入力キューを割り当てることができます。これは、1 つのアプリケーションが瞬間的に応答を停止した場合でも、他の VDM 内で動作しているアプリケーションは引き続き入力を受け取れることを意味します。逆に、各アプリケーションを個別の VDM 内で動作させると、多くのメモリを余分に消費するという欠点があります。16 ビット版アプリケーションを個別の VDM で動作させるようユーザーが要求した場合にのみ、このフラグを使うべきです。
CREATE_SHARED_WOW_VDMWindows NT/2000:このフラグは、16 ビット版 Windows ベースのアプリケーションを起動する場合にのみ有効です。WIN.INI ファイルの [Windows] セクションの DefaultSeparateVDM スイッチが TRUE に設定されている場合、このフラグを指定すると、CreateProcess 関数はそのスイッチを無効にし、新しいプロセスを共有 VDM 内で動作させます。
CREATE_SUSPENDEDプライマリスレッドをサスペンド状態にして、新しいプロセスを作成します。ResumeThread 関数を呼び出すまで、そのスレッドを開始させません。
CREATE_UNICODE_ENVIRONMENTlpEnvironment パラメータが指す環境ブロックの形式を指定します。このフラグを指定すると、その環境ブロックは Unicode 文字を使います。このフラグを指定しなかった場合、ANSI 文字を使います。
DEBUG_PROCESSこのフラグを指定すると、呼び出し側プロセスをデバッガ、新しいプロセスをデバッグ対象として扱います。システムは、デバッグ対象のプロセス内で発生するすべてのデバッグイベントを呼び出し側スレッドへ通知します。

このフラグを指定してプロセスを作成すると、呼び出し側スレッド(CreateProcess 関数を呼び出したスレッド)だけが 関数を呼び出せます。

Windows 95/98:新しいプロセスが 16 ビット版アプリケーションの場合、このフラグは有効ではありません。

DEBUG_ONLY_THIS_PROCESS呼び出し側プロセスがデバッグ対象であるときに、このフラグを指定せずに CreateProcess 関数を呼び出すと、呼び出し側プロセスを扱っているデバッガは、新しいプロセスもデバッグ対象とします。呼び出し側プロセスがデバッグ対象ではない場合、デバッグ関連の動作は発生しません。
DETACHED_PROCESSコンソールプロセスを対象としたフラグであり、新しいプロセスに、親プロセスのコンソールへのアクセスを許可しません。新しいプロセスは、 関数を使って新しいコンソールを作成できます。CREATE_NEW_CONSOLE フラグと同時に指定することはできません。

dwCreationFlags パラメータは、新しいプロセスの優先順位クラスの制御も行います。優先順位クラスは、プロセス内の各スレッドのスケジューリングを行うための優先順位を決定します。既定の優先順位クラスは NORMAL_PRIORITY_CLASS です。ただし、呼び出し側プロセスが IDLE_PRIORITY_CLASS または BELOW_NORMAL_PRIORITY_CLASS クラスである場合、子プロセス(新しいプロセス)の既定の優先順位クラスも、呼び出し側プロセスと同じクラスになります。優先順位クラスとして、次の値のいずれかを指定します。

優先順位クラス意味
ABOVE_NORMAL_PRIORITY_CLASSWindows 2000:このプロセスに、NORMAL_PRIORITY_CLASS より高く、HIGH_PRIORITY_CLASS より低い優先順位を割り当てます。
BELOW_NORMAL_PRIORITY_CLASSWindows 2000:このプロセスに、IDLE_PRIORITY_CLASS より高く、NORMAL_PRIORITY_CLASS より低い優先順位を割り当てます。
HIGH_PRIORITY_CLASSこのプロセスが、タイムクリティカルなタスクを実行することを示します。このクラスを割り当てられたプロセスのスレッドは、NORMAL_PRIORITY_CLASS や IDLE_PRIORITY_CLASS を割り当てられたプロセスのスレッドより先に実行されます。1 つの例はタスクリストであり、ユーザーがタスクリストを呼び出した場合、システムの負荷にかかわりなく、迅速に応答しなければなりません。HIGH_PRIORITY_CLASS を割り当てる場合、十二分の注意が必要です。CPU に大きく依存するアプリケーションにこのクラスを割り当てると、利用可能なほぼすべての CPU サイクルを占有する可能性があるからです。
IDLE_PRIORITY_CLASSシステムがアイドル状態のときにのみ、このプロセスを実行することを示します。このプロセスより、優先順位クラスの高い他のプロセスが先に実行されます。1 つの例はスクリーンセーバーです。子プロセスは、この優先順位クラスを継承します。
NORMAL_PRIORITY_CLASS特別なスケジューリングを必要としない、一般的なプロセスであることを示します。
REALTIME_PRIORITY_CLASSこのプロセスが、最も高い優先順位クラスを持つプロセスであることを示します。このクラスを割り当てられたプロセスに所属するスレッドは、重要なタスクを実行するオペレーティングシステムのプロセスを含むほかのすべてのプロセスのスレッドより先に実行されます。少しでも長い時間実行すると、ディスクキャッシュがフラッシュされなくなったり、マウスが応答しなくなることがあります。

lpEnvironment
新しいプロセスの環境ブロックへのポインタを指定します。このパラメータで NULL を指定した場合、新しいプロセスは呼び出し側プロセスと同じ環境を使います。

NULL で終わる文字列を複数組み合わせたものを 1 つのブロックとし、そのブロックを NULL で終わらせると、1 つの環境ブロックが形成されます。各文字列の形式は次のとおりです。

name=value

等号は区切り記号として使われるので、環境変数名の一部として使うことはできません。

アプリケーションがこのパラメータで NULL を指定する代わりに環境ブロックを提供した場合、システムの各ドライブでのカレントディレクトリの情報は、新しいプロセスへ自動的に伝達されることはありません。この状況の詳細と対処方法については、この関数の「解説」を参照してください。

1 つの環境ブロックでは、Unicode 文字または ANSI 文字を保持できます。パラメータが指す環境ブロックが Unicode 文字を保持している場合、dwCreationFlags フィールドで CREATE_UNICODE_ENVIRONMENT フラグを指定してください。それ以外の場合は、このフラグを指定しないでください。

ANSI 文字を保持している環境ブロックが、2 個の NULL(2 バイトの 0x00)で終わっていることに注意してください。1 つは最後の文字列の終わり、もう 1 つはブロックの終わりを意味します。一方、Unicode 文字列を保持している環境ブロックが、4 バイトの 0x00 で終わっていることに注意してください。2 つは最後の文字列の終わり、後の 2 つはブロックの終わりを意味します。

lpCurrentDirectory
新しいプロセスのカレントドライブ名とカレントディレクトリ名を保持している、NULL で終わる文字列へのポインタを指定します。この文字列は、ドライブ名とファイル名を含むフルパスでなければなりません。このパラメータで NULL を指定すると、新しいプロセスのカレントドライブとカレントディレクトリは、呼び出し側プロセスと等しくなります。このオプションは主に、アプリケーションを起動して最初のドライブと作業ディレクトリを指定する必要のあるシェルで使うことを意図して用意されたものです。
lpStartupInfo
新しいプロセスのメインウィンドウの表示方法を保持している、1 個の 構造体へのポインタを指定します。
lpProcessInformation
1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、新しいプロセスに関する情報が格納されます。

戻り値

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

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

解説

CreateProcess 関数は、新しいプログラムを実行するために使います。WinExec 関数や LoadModule 関数も利用できますが、これらは内部で CreateProcess 関数を呼び出す形で実装されています。

CreateProcess 関数は 1 個のプロセスを作成することに加えて、1 個のスレッドオブジェクトも作成します。指定されたプログラムの実行可能ファイルのイメージヘッダー内には、初期のスタックのサイズが規定されていますが、この関数は、そのサイズのスタックを使ってスレッドを作成します。このスレッドは、そのイメージのエントリポイントで実行を開始します。

新しいプロセスと新しいスレッドの各ハンドルは、作成された時点でフルアクセスの権利を割り当てられています。セキュリティ記述子が提供されていない場合、適切なタイプのオブジェクトハンドルを必要とする関数は、どちらかのハンドルを利用できます。セキュリティ記述子が提供されている場合、それ以降、そのハンドルを使おうとすると、アクセスを許可する前にアクセスチェックを行います。アクセスが拒否された場合、要求側プロセスはスレッドにアクセスする目的でそのハンドルを使うことはできません。

プロセスには、1 個のプロセス識別子が割り当てられます。プロセス識別子は、プロセスが終了するまで有効です。プロセスを識別する目的、または関数を使ってプロセスのハンドルを開く目的で、この識別子を利用できます。プロセス内の初期のスレッドにも、1 個のスレッド識別子が割り当てられます。スレッド識別子は、スレッドが終了するまで有効です。各識別子は、1 個の 構造体に格納されます。

lpApplicationName または lpCommandLine パラメータの文字列でアプリケーション名を指定する場合、アプリケーションにファイル名拡張子を含めても含めなくてもかまいません。ただし、1 つの例外があります。MS-DOS ベースまたは Windows ベースのアプリケーションのうち、拡張子が .com であるものは、アプリケーション名に .com 拡張子を含めなければなりません。

呼び出し側スレッドは、新しいプロセスが初期化を終え、どの入力も未処理のままにせず、ユーザー入力を待機する状態になるのを待つために、WaitForInputIdle 関数を使うことができます。親プロセスと子プロセスの間で同期を行う場合、この方法が役立ちます。CreateProcess 関数は、新しいプロセスが初期化を完了するまで待つことなく、すぐに制御を返すからです。たとえば、作成側プロセス(親プロセス)は、新しいプロセスに関連付けられているウィンドウを検索する前に、WaitForInputIdle 関数を使うことが考えられます。

プロセスをシャットダウンするには、ExitProcess 関数を使うのが好ましい方法です。この関数は、終了処理が進行中であることを、そのプロセスにアタッチしている DLL へ通知します。これ以外の方法でプロセスをシャットダウンすると、終了処理が進行中であることを DLL へ通知しません。1 つのスレッドが ExitProcess 関数を呼び出した場合、同じプロセスの他のスレッドは、(アタッチされている DLL のスレッド終了コードを含め)追加のコードを実行する機会なしで終了されることに注意してください。

ExitProcessExitThreadCreateThreadCreateRemoteThread の各関数、および CreateProcess 関数を呼び出した結果起動されるプロセスは、1 つのプロセス内で互いにシリアル化されます。1 つのアドレス空間内で一度に実施されるのは、これらのイベントのうちただ 1 つです。そのため、次の制約が適用されます。

•プロセスの起動と DLL の初期化を行うルーチンの中で新しいスレッドを作成することは可能ですが、そのプロセスに関係する DLL の初期化が終了するまでは、それらのスレッドは開始されません。

•DLL 初期化ルーチンまたは DLL デタッチルーチンの中に一度に存在できるスレッドは、ただ 1 つです。

•特定のプロセスに対して ExitProcess 関数を実行すると、そのプロセスに関係する DLL 初期化ルーチンまたはデタッチルーチン内にスレッドが存在しなくなるまで、ExitProcess 関数は制御を返しません。

プロセスを作成した後、そのプロセス内のすべてのスレッドを終了させ、 関数を使ってそのプロセスのハンドルとプロセス内のすべてのスレッドのハンドルを閉じない限り、そのプロセスはシステム内に残ります。CloseHandle 関数を使って、プロセスのハンドルとメインスレッドのハンドルの両方を閉じなければなりません。これらのハンドルが必要ない場合、プロセスを作成した直後にそれらのハンドルを閉じるのが最善です。

プロセス内の最後のスレッドが終了すると、次のイベントが発生します。

•そのプロセスが開いたすべてのオブジェクトは、暗黙的に閉じられます。

•(GetExitCodeProcess 関数が返した)プロセスの終了ステータスは、初期の値である STILL_ACTIVE から、終了した最後のスレッドの終了ステータスへ変化します。

•メインスレッドのスレッドオブジェクトはシグナル状態に設定され、そのオブジェクトを待っているすべてのスレッドの条件を満たします。

•プロセスオブジェクトはシグナル状態に設定され、そのオブジェクトを待っているすべてのスレッドの条件を満たします。

ドライブ C のカレントディレクトリが \MSVC\MFC である場合、「=C:」という環境変数が存在し、その値は \MSVC\MFC になります。lpEnvironment パラメータに関する上記の説明のとおり、lpEnvironment パラメータで NULL 以外の値を指定して CreateProcess 関数を呼び出すと、システムの各ドライブのカレントディレクトリに関する情報は、新しいプロセスへ自動的に伝達されません。アプリケーションは、カレントディレクトリの情報を、新しいプロセスへ手動で渡さなければなりません。この作業を行うには、アプリケーションは SetEnvironmentVariable 関数を使って「=X:」環境変数を明示的に作成し、アルファベット順にソートして(システムはソート済みの環境変数を使うからです)、lpEnvironment パラメータで指定する環境ブロックに入れなければなりません。前述の環境ブロックのソートが原因で、通常、これらの環境変数は環境ブロックの先頭に置かれます。

ドライブ X のカレントディレクトリを表す環境変数を取得する 1 つの方法は、("X:",. .) を呼び出すことです。この結果、アプリケーションが環境ブロック内で検索を行う必要がなくなります。返されたフルパスが X:\ である場合、その値を環境データとして渡す必要はありません。新しいプロセスにとって、ドライブ X の既定のカレントディレクトリは、ルートディレクトリだからです。

CreateProcess 関数が返したハンドルには、プロセスオブジェクトに対する PROCESS_ALL_ACCESS アクセス権が割り当てられています。

lpcurrentDirectory パラメータで指定するカレントディレクトリは、子プロセスのカレントディレクトリです。最初から 2 番目の lpCommandLine パラメータで指定するカレントディレクトリは、親プロセスのカレントディレクトリです。

注意  オペレーティングシステムがプロセスに提供するコマンドラインの中の実行可能ファイル名は、必ずしも、呼び出し側プロセスが CreateProcess 関数を呼び出す際に指定した実行可能ファイル名と一致しているとは限りません。完全修飾パスを指定せずに実行可能ファイル名を CreateProcess 関数に渡した場合、オペレーティングシステムはそのファイル名に完全修飾パスを追加することがあります。

Windows NT/2000: dwCreationFlags パラメータで CREATE_NEW_PROCESS_GROUP フラグを指定してプロセスを作成した場合、新しいプロセス用に SetConsoleCtrlHandler(NULL,TRUE) が暗黙的に呼び出されます。これは、新しいプロセスで Ctrl+C キーを無効にすることを意味します。この結果、シェルは Ctrl+C を自ら処理し、選択的にその信号をサブプロセスへ渡すことができます。一方、Ctrl+Break は無効になっていないので、プロセスやプロセスグループへの割り込みを行う目的で利用できます。

対応情報

Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winbase.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Kernel32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

, , CreateProcessAsUser, CreateProcessWithLogonW, CreateRemoteThread, CreateThread, ExitProcess, ExitThread, , GetCommandLine, GetEnvironmentStrings, GetExitCodeProcess, , GetStartupInfo, , , LoadModule, OpenProcess, , ResumeThread, , , , , TerminateProcess, WaitForInputIdle, , WinExec

表示: