<Return[C]><Top>

CreateSemaphore

Declare Function Api_CreateSemaphore& Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes As SECURITY_ATTRIBUTES, ByVal lInitialCount&, ByVal lMaximumCount&, ByVal lpName$)

Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes As SECURITY_ATTRIBUTES, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long

名前付きまたは名前なしのセマフォオブジェクトを作成または開く。

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

    スはそのハンドルを継承できない。
    Windows NT/2000:SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバで、新しいセマフォのセキュリティ記述子を設定

    する。NULL を指定すると、既定のセキュリティ記述子がそのセマフォに割り当てられる。
lInitialCount
    セマフォオブジェクトの初期のカウントを指定する。0 以上、lMaximumCount 以下の値を指定する。セマフォは、カウントが 0 より大きい場

    合はシグナル状態になり、カウントが 0 の場合は非シグナル状態になる。待機関数(WaitForSingleObject 関数など)を使って、そのセマフ

    ォを待っていたスレッドを解放すると、カウントが 1 つ減る。ReleaseSemaphore 関数を使うと、任意の数だけ増やすことができる。
lMaximumCount
    セマフォオブジェクトの最大カウントを指定する。0 より大きい値を指定しなければならない。
lpName
    セマフォオブジェクトの名前を保持している、NULL で終わる文字列へのポインタを指定する。名前の最大の長さは、MAX_PATH 文字で

    ある。名前を比較する際に、大文字と小文字は区別される。
    lpName パラメータで指定した名前が既存のセマフォオブジェクトの名前と一致している場合、この関数を実行するには、既存のオブジェクト

    に対する SEMAPHORE_ALL_ACCESS アクセス権が必要である。この場合、lInitialCount パラメータと lMaximumCount パラメータ

    は、オブジェクトを作成したプロセスによって既に設定されているため、無視される。また、lpSemaphoreAttributes パラメータが NULL で

    はない場合、子プロセスがハンドルを継承できるかどうかの指定は有効であるが、セキュリティ記述子のメンバは無視される。
    lpName パラメータで NULL を指定すると、名前なしのセマフォオブジェクトが作成される。
    lpName パラメータで指定した名前が、既存のイベント、ミューテックス、待機可能なタイマ、ジョブ、ファイルマッピングオブジェクトのいずれ

    かの名前と一致すると、この関数は失敗し、 関数は ERROR_INVALID_HANDLE を返す。これらのオブジェクトは、同じ名前空間を共  

    有しているからである。
    Terminal Services:グローバル名前空間またはセッション名前空間でオブジェクトを明示的に作成するために、「Global\」または

    「Local\」のプレフィックスを付けることができる。名前の残りの部分は、円記号(\)を除き、任意の文字を記述できる。
    Windows 2000:Terminal Services が動作していない Windows 2000 システムでは、「Global\」と「Local\」の各プレフィックスは無

    視される。名前の残りの部分は、円記号(\)を除き、任意の文字を記述できる。
    Windows NT 4.0 以前と Windows 95/98:名前は、円記号(\)を除き、任意の文字を記述できる。

戻り値
    関数が成功すると、セマフォオブジェクトのハンドルが返る。指定したセマフォオブジェクトが既に存在していた場合も、そのオブジェクトのハン

    ドルが返る。その場合、 関数は、ERROR_ALREADY_EXISTS を返す。
    関数が失敗すると、NULL が返る。拡張エラー情報を取得するには、GetLastError 関数を使う。

解説
    CreateSemaphore 関数が返すハンドルには、新しいセマフォオブジェクトへの SEMAPHORE_ALL_ACCESS 権が割り当てられていて、セ

    マフォオブジェクトのハンドルを要求する任意の関数で使うことができる。