我在Windows中的大部分日常编程工作现在都是各种I/O操作(管道,控制台,文件,套接字......).我很清楚从不同类型的句柄读取和写入的不同方法(同步,异步等待事件完成,等待文件HANDLE,I/O完成端口和可警告的I/O).我们使用其中许多.
对于我们的一些应用程序,只有一种方法来处理所有句柄是非常有用的.我的意思是,程序可能不知道它收到了什么样的句柄,我们想要使用,比方说,I/O完成端口.
首先我会问:
我们假设我有一个句柄:
HANDLE h;
Run Code Online (Sandbox Code Playgroud)
我从某个地方收到了I/O进程.有没有简单可靠的方法来找出它创建的标志?有问题的主要标志是FILE_FLAG_OVERLAPPED.
到目前为止,我所知道的唯一方法是尝试将这样的句柄注册到I/O完成端口(使用CreateIoCompletionPort()).如果成功,则使用FILE_FLAG_OVERLAPPED创建句柄.但是之后只能使用I/O完成端口,因为如果不关闭它HANDLE h本身就不能从中取消注册句柄.
提供一种简单的方法来确定存在FILE_FLAG_OVERLAPPED,我的第二个问题就出现了:
有没有办法如何将这样的标志添加到现有的句柄?这将使最初为同步操作打开的句柄打开以进行异步操作.有没有办法如何创建相反的(删除FILE_FLAG_OVERLAPPED从异步创建同步句柄)?
通过MSDN阅读和google搜索后,我没有找到任何直接的方法.至少会有一些技巧可以做同样的事吗?就像使用CreateFile()函数或类似的东西以相同的方式重新创建句柄一样?某些东西甚至部分记录或根本没有记录?
我需要这个的主要地方是确定进程应该从第三方应用程序发送给它的句柄读取/写入的方式(或改变方式).我们无法控制第三方产品如何创建其句柄.
亲爱的Windows大师:请帮助!
带着敬意
马丁