1

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

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

谢谢阿迪亚

4

1 回答 1

3

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

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

回到您的情况,如果您的应用程序简单且具有确定性,那么当您重新运行应用程序时,您很有可能获得相同的 HANDLE 值,这仅仅是因为 OS 可能会确定性地填充对象表。但是,它不能保证,您不能依赖它。

由于句柄不能按字面意思传递给不同的进程,Windows 具有DuplicateHandle函数,如果一个进程想要将相同的对象传递给另一个进程,则可以使用该函数。请注意,使用 DuplicateHandle,源句柄只能在源进程中使用,而目标句柄只能在目标进程中使用。

于 2013-05-02T03:12:43.583 回答