継承

子プロセスは、親プロセスからいくつかのプロパティとリソースを継承できます。 また、子プロセスが親プロセスからプロパティを継承しないようにすることもできます。 次のコードを継承できます。

  • CreateFile 関数によって返されるオープン ハンドル。 これには、ファイルへのハンドル、コンソール入力バッファー、コンソール画面バッファー、名前付きパイプ、シリアル通信デバイス、および mailslots が含まれます。
  • ハンドルを開いて、処理、スレッド、ミューテックス、イベント、セマフォ、名前付きパイプ、匿名パイプ、およびファイル マッピング オブジェクトを処理します。 これらは、 それぞれ CreateProcessCreateThreadCreateMutexCreateEventCreateSemaphoreCreateNamedPipeCreatePipeCreateFileMapping 関数によって返されます。
  • 環境変数。
  • 現在のフォルダー。
  • プロセスがデタッチされるか、新しいコンソールが作成されない限り、コンソール。 子コンソール プロセスでは、親の標準ハンドルと、入力バッファーとアクティブな画面バッファーへのアクセスを継承することもできます。
  • SetErrorMode 関数によって設定されたエラー モード。
  • プロセッサ アフィニティ マスク。
  • ジョブとの関連付け。

子プロセスでは、次の処理は継承されません。

  • Priority クラス。
  • LocalAllocGlobalAllocHeapCreateHeapAlloc によって返されるハンドル。
  • GetCurrentProcess 関数または GetCurrentThread 関数によって返されるハンドルと同様に、擬似ハンドル。 これらのハンドルは、呼び出し元のプロセスに対してのみ有効です。
  • LoadLibrary 関数によって返される DLL モジュール ハンドル。
  • GDI または USER ハンドル ( HBITMAPHMENU など)。

ハンドルの継承

子プロセスは親のハンドルの一部を継承できますが、他のハンドルは継承できません。 ハンドルを継承するには、次の 2 つの操作を行う必要があります。

  • ハンドルを作成、開く、または複製するときにハンドルを継承するように指定します。 作成関数は、通常、この目的のためにSECURITY_ATTRIBUTES構造体の bInheritHandle メンバーを使用します。 DuplicateHandle では 、bInheritHandles パラメーターを 使用します。
  • CreateProcess 関数を呼び出すときに bInheritHandles パラメーターを TRUE に設定して、継承可能なハンドルを継承するように指定します。 さらに、標準入力、標準出力、標準エラー ハンドルを継承するには、STARTUPINFO 構造体の dwFlags メンバーに STARTF_USESTDHANDLESを含める必要があります。

特定の子プロセスによって継承されるハンドルの一覧を指定するには、PROC_THREAD_ATTRIBUTE_HANDLE_LIST フラグを指定して UpdateProcThreadAttribute 関数を呼び出します。

継承されたハンドルは、親プロセスと同じオブジェクトを子プロセスで参照します。 また、同じ値とアクセス権限を持ちます。 したがって、1 つのプロセスがオブジェクトの状態を変更すると、その変更は両方のプロセスに影響します。 ハンドルを使用するには、子プロセスがハンドル値を取得し、それが参照するオブジェクトを "認識" する必要があります。 通常、親プロセスは、コマンド ライン、環境ブロック、または何らかの形式の プロセス間通信を介して、この情報を子プロセスに通信します。

SetHandleInformation 関数を使用して、既存のハンドルが継承可能かどうかを制御します。

環境変数の継承

子プロセスは、既定で親プロセスの環境変数を継承します。 ただし、 CreateProcess を使用すると、親プロセスで別の環境変数ブロックを指定できます。 詳細については、「 環境変数」を参照してください。

現在のディレクトリの継承

GetCurrentDirectory 関数は、呼び出し元プロセスの現在のディレクトリを取得します。 子プロセスは、既定で親プロセスの現在のディレクトリを継承します。 ただし、 CreateProcess を使用すると、親プロセスで子プロセスに別の現在のディレクトリを指定できます。 呼び出し元プロセスの現在のディレクトリを変更するには、 SetCurrentDirectory 関数を使用します。