多个CreateFile调用返回相同的文件句柄

时间:2013-05-02 01:21:41

标签: c visual-studio-2010 winapi visual-c++ handle

我有一个使用CreateFileA打开COM端口的例程。 该函数创建为DLL,我有一个EXE(使用VS2010)来打开不同的COM端口。 一个观察是,如果我使用相同的EXE打开不同的端口,返回的文件句柄号是不同的。 如果我打开EXE的多个实例并打开不同的COM端口,则返回的文件句柄号是相同的。 EG-> 1 exe用于打开COM端口11,12,13,14,它们返回文件句柄号 - 0x200,0x210,0x21c,0x220 4个exes,每个打开一个COM端口,它们都返回File Handle Number - 0x200。

我想知道这是否是由于windows线程导致exe的每个实例都有一个单独的线程,因此文件号相同? 使用我的exe与Ports通信没有任何问题。 了解这一点的任何线索都会有所帮助。 (另一个应用程序正在尝试使用此DLL,并且在返回相同的文件句柄号时遇到问题)

由于 阿迪亚

1 个答案:

答案 0 :(得分:3)

HANDLE的值仅在一个过程中有效。更清楚的是,句柄被实现为某些内核对象表的索引(或偏移)。该表存储在内核存储器中并分配给特定进程,即每个进程都有自己的不同对象表。

由于句柄只是对某些表的偏移,并且这些表对于不同的进程完全不同,因此不能为不同的进程传递(或比较)HANDLE的值。

回到你的情况,如果你的应用程序是简单和确定的,你很有可能在重新运行应用程序时获得相同的HANDLE值,因为操作系统可能会确定性地填充对象表。然而,它不能保证,你不能依赖它。

由于句柄不能直接传递给不同的进程,因此Windows具有DuplicateHandle函数,如果一个进程想要将同一对象传递给其他进程,则可以使用该函数。请注意,使用DuplicateHandle时,源句柄只能用于源进程,而目标句柄只能用于目标进程。