La mayor parte de mi trabajo diario de programación en Windows se realiza actualmente en torno a operaciones de E/S de todo tipo (tuberías, consolas, archivos, enchufes, ...). Soy muy consciente de los diferentes métodos de lectura y escritura desde y hacia diferentes tipos de manejadores (sincrónico, asíncrono esperando compleción en eventos, esperando en HANDLEs de archivo, puertos de E/S de finalización y E/S alertable). Usamos muchos de esos.¿Es posible cambiar el HANDLE que se ha abierto para que las E/S síncronas se abran para la E/S asíncrona durante su vida útil?
Para algunas de nuestras aplicaciones, sería muy útil tener una sola forma de tratar todas las asas. Quiero decir, el programa puede no saber qué tipo de identificador ha recibido y nos gustaría utilizar, digamos, puertos de terminación de E/S para todos.
Así que primero le pediría:
Supongamos que tengo un mango:
HANDLE h;
que ha sido recibida por mi proceso de E/S de alguna parte. ¿Hay alguna manera fácil y confiable de averiguar con qué banderas se ha creado? La bandera principal en cuestión es FILE_FLAG_OVERLAPPED
.
La única forma que conozco hasta ahora es tratar de registrar dicho identificador en el puerto de E/S de finalización (usando CreateIoCompletionPort()
). Si eso sucede, el identificador se ha creado con FILE_FLAG_OVERLAPPED. Pero solo debe usarse el puerto de finalización de E/S, ya que no se puede anular el registro del identificador sin cerrar el HANDLE
h
.
siempre que exista una manera fácil de determinar la presencia de FILE_FLAG_OVERLAPPED
, no habría llegado a mi segunda pregunta:
¿Hay alguna manera cómo agregar como bandera para identificador ya existente? Eso haría que un asa que se haya abierto originalmente para operaciones sincrónicas esté abierta para asíncrona. ¿Habría una manera de cómo crear opuesto (eliminar el FILE_FLAG_OVERLAPPED
para crear el identificador síncrono de asincrónico)?
No he encontrado ninguna manera directa después de leer a través de MSDN y buscar en Google mucho. ¿Habría al menos algún truco que podría hacer lo mismo? Al igual que volver a crear el mango de la misma manera utilizando la función CreateFile()
o algo similar? Algo incluso parcialmente documentado o no documentado en absoluto?
El lugar principal donde necesitaría esto, es determinar la forma en que (o cambiar el camino) el proceso debe leer/escribir desde identificadores enviados por aplicaciones de terceros. No podemos controlar cómo los productos de terceros crean sus identificadores.
Estimados gurús de Windows: ayuda, por favor!
Con respecto
Martin
Tenga en cuenta que el truco 'CreateIoCompletionPort()' es en realidad bastante ordenado suponiendo que realmente desea utilizar el identificador con ese puerto específico. ¡No había pensado en eso! –