lpSecurityAttributes
的{{1}}指向的结构?CreateNamedPipe()的MSDN文档说:
lpSecurityAttributes [in,optional]
指向SECURITY_ATTRIBUTES结构的指针,该结构为 new 命名管道指定安全描述符...
强调我的。 “new”是指新命名管道,还是命名管道的新实例?它继续说:
说明
使用CreateNamedPipe创建命名管道的实例 用户必须具有对命名管道的FILE_CREATE_PIPE_INSTANCE访问权限 宾语。 如果正在创建新的命名管道,则为访问控制列表 (ACL)来自security attributes参数定义了自由选择 命名管道的访问控制。
(再一次,强调我的。)人们可以读到这意味着只有在创建命名管道的第一个实例( new 命名管道)时才使用CreateNamedPipe()
,并且在创建同一命名管道的更多实例时忽略。如果是这样,则只需要lpSecurityAttributes
结构的一个实例。
或许你必须为每个实例传入一个有效的lpSecurityAttributes,但它可以(应该?)是同一个吗?
或许你必须为每个管道实例分配一个新的SECURITY_ATTRIBUTES结构?
我的相关问题 - 一旦对lpSecurityAttributes
的调用返回,SECURITY_ATTRIBUTES结构是否会被销毁,或者它是否必须保持有效直到最后一个句柄(到管道,或者只是那个管道实例?)关闭 - 甚至没有解决。
有没有人对这两个问题有明确的答案?
答案 0 :(得分:4)
您需要为每次调用CreateNamedPipe传递有效的SECURITY_ATTRIBUTES结构或NULL。您可以重复使用相同的结构进行其他调用,也可以使用单独的结构,以更方便的方式。在来自不同线程的多个同时调用中使用相同的结构可能不安全 - 我怀疑它会没问题,但无论如何我都会避免它。
'新'意味着'新管'不是'新实例'。如果命名管道已存在,则不使用lpSecurityDescriptor成员中的ACL。因此,如果您知道要创建现有管道的新实例,并且不需要设置bInheritHandle,则应该只为lpSecurityAttributes传递NULL。如果确实需要设置bInheritHandle,请确保lpSecurityDescriptor为NULL或指向有效的安全描述符。
如前所述,lpSecurityAttributes中的内容可以在调用返回后立即丢弃(除非您计划在另一个调用中重用它!),是的,包括分配给安全描述符的内存。
答案 1 :(得分:2)
呼叫结束后复制结构。这适用于创建内核对象时的所有安全描述符调用。
因此:在通话结束后你可以丢弃它的内容。