引用here:
hPipe = CreateFile(
lpszPipename, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
0, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL);
上述代码如何确保它实际打开管道而不是现有的硬盘文件?
顺便说一句,如何打开持久管道以便多次使用?
答案 0 :(得分:4)
管道名称必须以\\.\pipe\
开头(或更一般地,\\servername\pipe\
)。硬盘驱动器上的文件永远不会有该前缀,因此您只需要确保该名称具有该前缀。或者,您可以使用CallNamedPipe
,如果传递的名称不是命名管道,那么(我很确定)会失败。
我不确定您的第二个问题是什么意思 - 您可以根据需要通过管道发送尽可能多的消息/数据。如果您打算在服务器上打开一个可供多个客户端使用的命名管道,则在调用CreateNamedPipe
时,最后一个参数指定允许的最大并发实例数(客户端)。
答案 1 :(得分:4)
它打开管道的方式是文件名中的前缀。它必须是\\\\.\\pipe\\pipename
,这不是合法的文件名(对于实际文件,您通常以相对路径或驱动器号,冒号和斜线开头,除非在极少数情况下使用设备打开ID或某些此类)。看到它无法打开文件,它必须打开一个管道。
要打开持久性管道,我不确定您是否要同时从多个应用程序中使用它(如果是这样,您可以从每个应用程序中打开它,但要注意不要阻止它)或者让它在两者之间保持不变会话。如果是后者,我不完全确定,但是我从来没有听说过没有程序打开时保持管道打开的方法(在某种程度上类似于保持文件打开,我猜)。 可能,只要你没有CloseHandle
,它就会保持打开状态直到下次重启。值得测试,至少。
如果您需要在应用程序或会话之间进行持久数据传输,您可能希望找到更可靠(更灵活)的方法。如果出现意外情况(在多个线程/进程协同工作时应始终预期),管道很容易被阻塞,这可能会冻结一个或两个连接的应用程序(通常甚至在调试器中甚至杀死它们的程度很困难)。