La maggior parte del mio lavoro quotidiano di programmazione in Windows si basa oggi su operazioni di I/O di qualsiasi tipo (pipe, console, file, socket, ...). Sono ben consapevole dei diversi metodi di lettura e scrittura da/a diversi tipi di handle (sincrono, asincrono in attesa di completamento sugli eventi, attesa di file HANDLE, porte di I/O di completamento e I/O alertable). Usiamo molti di quelli.E 'possibile modificare HANDLE che è stato aperto per l'I/O sincrono da aprire per l'I/O asincrono durante la sua durata?
Per alcune delle nostre applicazioni sarebbe molto utile avere un solo modo per trattare tutte le maniglie. Voglio dire, il programma potrebbe non sapere, che tipo di handle ha ricevuto e vorremmo usare, diciamo, porte di completamento I/O per tutti.
Quindi, prima vorrei chiedere:
Supponiamo che io ho una maniglia:
HANDLE h;
che è stato ricevuto da mio processo per l'I/O da qualche parte. C'è un modo facile e affidabile per scoprire con quali flag è stato creato? La bandiera principale in questione è FILE_FLAG_OVERLAPPED
.
L'unico modo a me noto finora è provare a registrare tale handle nella porta di completamento I/O (utilizzando CreateIoCompletionPort()
). Se questo succede, l'handle è stato creato con FILE_FLAG_OVERLAPPED. Tuttavia, è necessario utilizzare solo la porta di completamento I/O, poiché non è possibile annullare la registrazione dell'handle senza chiudere lo stesso HANDLE
h
.
fornendo c'è un modo semplice per determinare la presenza di FILE_FLAG_OVERLAPPED
, sarebbe venuto mia seconda domanda:
C'è un modo come aggiungere come bandiera per maniglia già esistente? Ciò renderebbe un handle che è stato originariamente aperto per le operazioni sincrone per essere aperto per asincrono. Ci sarebbe un modo come creare opposto (rimuovere il FILE_FLAG_OVERLAPPED
per creare l'handle sincrono da asincrono)?
Non ho trovato alcun modo diretto dopo aver letto tramite MSDN e googling molto. Ci sarebbe almeno qualche trucco che potrebbe fare lo stesso? Come ricreare l'handle nello stesso modo usando la funzione CreateFile()
o qualcosa di simile? Qualcosa anche parzialmente documentato o non documentato?
Il luogo principale in cui avrei bisogno di questo, è determinare il modo in cui (o modificare il modo) il processo dovrebbe leggere/scrivere dagli handle inviati ad esso da applicazioni di terze parti. Non possiamo controllare in che modo i prodotti di terze parti creano le loro maniglie.
Cari guru di Windows: aiuto per favore!
Per quanto riguarda
Martin
Si noti che il trucco 'CreateIoCompletionPort()' è in realtà abbastanza accurato ipotizzando che si desideri effettivamente utilizzare l'handle con quella porta specifica. Non ci avevo pensato! –