Windows での私の日常的なプログラミング作業のほとんどは、現在、あらゆる種類の I/O 操作 (パイプ、コンソール、ファイル、ソケットなど) に関するものです。私は、さまざまな種類のハンドル (同期、非同期、イベントの完了待ち、ファイル HANDLE、I/O 完了ポート、アラート可能 I/O の待機) からの読み取りと書き込みのさまざまな方法をよく知っています。私たちはそれらの多くを使用しています。
一部のアプリケーションでは、すべてのハンドルを 1 つの方法で処理できると非常に便利です。つまり、プログラムは、受け取ったハンドルの種類を認識していない可能性があり、たとえば、すべての I/O 完了ポートを使用したいと考えています。
だから最初に私は尋ねます:
私がハンドルを持っているとしましょう:
HANDLE h;
これは、どこかからの I/O のプロセスによって受信されました。作成されたフラグを簡単かつ確実に確認する方法はありますか? 問題の主なフラグはFILE_FLAG_OVERLAPPED
.
これまでのところ、私が知っている唯一の方法は、そのようなハンドルを I/O 完了ポートに登録しようとすることです (を使用CreateIoCompletionPort()
)。それが成功した場合、ハンドルは FILE_FLAG_OVERLAPPED で作成されています。HANDLE
h
ただし、I/O 完了ポートのみを使用する必要があります。これは、ハンドル自体を閉じないとハンドルから登録を解除できないためです。
の存在を判断する簡単な方法がFILE_FLAG_OVERLAPPED
あるとすれば、次の 2 番目の質問があります。
そのようなフラグを既存のハンドルに追加する方法はありますか? これにより、同期操作用に最初に開いていたハンドルが、非同期操作用に開かれます。反対の方法を作成する方法はありますか (FILE_FLAG_OVERLAPPED
非同期から同期ハンドルを作成するために削除します)?
MSDN を読み、何度もグーグル検索した後も、直接的な方法は見つかりませんでした。同じことができる少なくともいくつかのトリックはありますか?CreateFile()
関数などを使用して同じ方法でハンドルを再作成するようなものですか? 部分的に文書化されているか、まったく文書化されていないものですか?
私がこれを必要とする主な場所は、プロセスがサードパーティのアプリケーションによって送信されたハンドルから読み取り/書き込みを行う方法を決定する (または方法を変更する) ことです。サードパーティ製品がハンドルを作成する方法を制御することはできません。
親愛なる Windows の達人: 助けてください!
よろしく
マーティン