gpt4 book ai didi

c - 多个 CreateFileA 调用返回相同的文件句柄

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:24 35 4
gpt4 key购买 nike

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

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

谢谢阿迪亚

最佳答案

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

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

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

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

关于c - 多个 CreateFileA 调用返回相同的文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16328924/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com