<Return[D]><Top>

DuplicateHandle

Declare Function Api_DuplicateIcon& Lib "shell32" Alias "DuplicateIcon" (ByVal hInst&, ByVal hIcon&)

Declare Function DuplicateIcon Lib "shell32" Alias "DuplicateIcon" (ByVal hInst As Long, ByVal hIcon As Long) As Long

オブジェクトハンドルの複製を作成する。複製されたハンドルは、複製元のハンドルと同じオブジェクトを参照する。したがって、参照先のオブジェクトに何か変更を加えると、そのことは両方のハンドルへ反映される。たとえば、1 つのファイルハンドルに関する現在のファイルマークは、常に両方のハンドルで共通している。

パラメータ
hSourceProcessHandle
    複製対象のハンドルが存在するプロセスを指定する。
    Windows NT/2000:このハンドルは、PROCESS_DUP_HANDLE アクセス権を備えていなければならない。
hSourceHandle
    複製対象のハンドルを指定する。これは、複製元プロセスのコンテキスト内で有効な、既に開いている複製可能なオブジェクトの一覧につい

    ては、この関数の「解説」を参照してください。
hTargetProcessHandle
    複製されたハンドルを受け取るプロセスのハンドルを指定する。このハンドルは、PROCESS_DUP_HANDLE アクセス権を備えていなけれ

    ばならない。
lpTargetHandle
    1 個の変数へのポインタを指定する。関数から制御が返ると、この変数に、複製されたハンドルの値が格納される。このハンドルの値は、

    複製先プロセスのコンテキスト内で有効なものでなければならない。
    lpTargetHandle に NULL を指定すると、関数はハンドルを複製するが、複製されたハンドルの値を呼び出し側へ返さない。この振る舞い

    は、この関数の以前のバージョンとの下位互換性の目的でのみ存在している。このような指定を行うと、複製先プロセスが終了するまでシ

    ステムリソースを無駄に使うことになるので、この機能を使うべきではない。
dwDesiredAccess
    新しいハンドルで必要なアクセス権を指定する。dwOptions パラメータで DUPLICATE_SAME_ACCESS フラグを指定した場合、

    dwDesiredAccess パラメータは無視される。それ以外の場合、指定できるフラグは、複製先ハンドルに関連付けられるオブジェクトのタイプ

    に依存する。新しいハンドルは複製元のハンドルよりも多くのアクセス権を備えていてもかまわないことに注意する。
bInheritHandle
    ハンドルが継承可能かどうかを指定する。TRUE を指定すると、複製先プロセスが作成した新しいプロセスは、複製先ハンドルを継承でき

    る。FALSE を指定すると、複製先ハンドルを継承できない。
dwOptions
    オプションの動作を指定する。0、または次の値の任意の組み合わせを指定できます。

    値                                               

意味                                                                                                                             

    DUPLICATE_CLOSE_SOURCE

複製元ハンドルを閉じる。どのようなエラーステータスが返された場合でもこのハンドルを閉じる。

    DUPLICATE_SAME_ACCESS

dwDesiredAccess パラメータを無視する。複製先ハンドルは、複製元ハンドルと同じアクセス権を備えている。


戻り値
    関数が成功すると、0 以外の値が返る。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。

解説
    DuplicateHandle 関数は、複製元プロセスと複製先プロセスのどちらからも呼び出せる。複製元プロセスと複製先プロセスが同じであって

    も、この関数を呼び出せる。たとえば、1 つのプロセスがこの関数を使って、継承可能なハンドルを複製して継承不可能なハンドルを作成し

    たり、複製元ハンドルとは異なるアクセス権を備えたハンドルを作成できる。
    複製を行うプロセスは、 関数を使って、自らのハンドルを取得する。他のプロセスのハンドルを取得するには、何らかの形式のプロセス間

    通信(たとえば、名前付きパイプや共有メモリ)を使って、プロセスの識別子を、複製を行うプロセスへ通知する必要が生じることがある。次

    に関数でこの識別子を使って、ハンドルを開く。
    複製先プロセス以外のプロセスが DuplicateHandle 関数を呼び出す場合、複製を行うプロセスは、プロセス間通信を使って、複製先ハン

    ドルの値を複製先プロセスへ渡さなければならない。
    DuplicateHandle 関数は、次のオブジェクトタイプのハンドルを複製できる。