【问题标题】:CreateNamedPipe ERROR_INVALID_NAMECreateNamedPipe ERROR_INVALID_NAME
【发布时间】:2013-03-16 20:50:16
【问题描述】:

代码sn-p:

void RunThread(void* unused_args)
{
    PSECURITY_DESCRIPTOR sdsc;
    ULONG size;
    ConvertStringSecurityDescriptorToSecurityDescriptor("S:(ML;;NW;;;LW)", SDDL_REVISION_1, &sdsc, &size);
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = false;
    sa.lpSecurityDescriptor = sdsc;
    HANDLE pipe = CreateNamedPipe("\\.\pipe\mmaivpc_test_pipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, 255, 1024, 1024, 0, &sa);
    DWORD error = GetLastError();
}

如果您还没有从函数名中弄清楚,这个函数将被_beginthread 调用。 GetLastError() 正在返回 ERROR_INVALID_NAME,我不知道为什么。

【问题讨论】:

  • 你忽略了警告,对吧?大多数程序员的习惯做法,不知道为什么!

标签: multithreading winapi visual-c++ named-pipes


【解决方案1】:

您需要转义用于管道名称的字符串文字中的反斜杠:

HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\mmaivpc_test_pipe",
                              PIPE_ACCESS_DUPLEX, 
                              PIPE_TYPE_BYTE, 255, 1024, 1024, 0, &sa);

【讨论】:

    【解决方案2】:

    你应该避开你的反斜杠:)

    【讨论】:

      【解决方案3】:

      如果您在路径中使用正斜杠 /,您的代码将更具可读性,并且您将避免此类错误。

      似乎没有多少人知道 windows 接受 / 和 \ 作为目录分隔符。

      【讨论】:

        【解决方案4】:

        是的,网络共享也一样,比如 \\server1 ,我们必须在 C++ 中表示为 \\\\server1 为了逃避 '\' 我们必须再使用一个 '\'

        【讨论】:

        • 嗨,你试过这个,或者你得到的任何解决方案,很想知道什么是有效的
        【解决方案5】:

        将参数 lpName 包装到 TEXT() 中,如下所示:

        HANDLE pipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\mmaivpc_test_pipe"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE, 255, 1024, 1024, 0, &sa);
        

        并且名称必须采用\\\\.\\pipe\\your_pipe_name 格式。 管道名称不区分大小写。

        这是一个很好的例子https://msdn.microsoft.com/en-us/library/windows/desktop/aa365588(v=vs.85).aspx

        【讨论】:

          猜你喜欢
          • 2015-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-06
          • 2016-11-23
          相关资源
          最近更新 更多