CreateNamedPipe ERROR_INVALID_NAME

时间:2013-03-16 20:50:17

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

代码段:

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,我无法弄清楚原因。

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

你应该逃避反斜杠:)

答案 2 :(得分:1)

如果你在路径中使用正斜杠/,你的代码会更具可读性,你可以避免这样的错误。

似乎并不是很多人都知道windows同时接受/和\作为目录分隔符。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

将参数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