【发布时间】:2010-03-19 07:53:07
【问题描述】:
现在,我在 Windows 中的大部分日常编程工作都围绕着各种 I/O 操作(管道、控制台、文件、套接字……)。我很清楚从/向不同类型的句柄读取和写入的不同方法(同步、异步等待事件完成、等待文件句柄、I/O 完成端口和可警报 I/O)。我们使用其中的许多。
对于我们的某些应用程序,只有一种方法来处理所有句柄会非常有用。我的意思是,程序可能不知道它收到了什么样的句柄,我们想使用,比如说,所有的 I/O 完成端口。
所以首先我要问:
假设我有一个句柄:
HANDLE h;
我的进程从某个地方收到了 I/O。有没有简单可靠的方法来找出它是用什么标志创建的?有问题的主要标志是FILE_FLAG_OVERLAPPED。
到目前为止,我知道的唯一方法是尝试将此类句柄注册到 I/O 完成端口(使用 CreateIoCompletionPort())。如果成功,则使用 FILE_FLAG_OVERLAPPED 创建句柄。但随后只能使用 I/O 完成端口,因为在不关闭 HANDLE h 本身的情况下无法从其中注销句柄。
如果有一种简单的方法可以确定FILE_FLAG_OVERLAPPED 的存在,那么我的第二个问题就会出现:
有什么办法可以将这样的标志添加到已经存在的句柄中?这将使最初为同步操作打开的句柄为异步打开。有没有办法创建相反的(删除FILE_FLAG_OVERLAPPED以从异步创建同步句柄)?
在阅读 MSDN 和谷歌搜索后,我没有找到任何直接的方法。至少会有一些技巧可以做到这一点吗?就像使用CreateFile() 函数或类似的东西以同样的方式重新创建句柄?甚至部分记录或根本没有记录的内容?
我需要这个的主要地方是确定进程应该从第三方应用程序发送给它的句柄中读取/写入的方式(或更改方式)。我们无法控制第三方产品如何创建句柄。
尊敬的 Windows 专家:请帮助!
关于
马丁
【问题讨论】:
-
请注意,
CreateIoCompletionPort()技巧实际上非常简洁,假设您确实想使用该特定端口的句柄。没想到!
标签: winapi asynchronous synchronous createfile overlapped-io