2

代码片段:

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,我不知道为什么。

4

5 回答 5

5

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

HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\mmaivpc_test_pipe",
                              PIPE_ACCESS_DUPLEX, 
                              PIPE_TYPE_BYTE, 255, 1024, 1024, 0, &sa);
于 2013-03-16T20:52:43.570 回答
2

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

于 2013-03-16T20:54:21.317 回答
1

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

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

于 2013-03-17T09:42:28.000 回答
0

是的,网络共享的方式也一样,例如 \\server1 ,我们必须在 C++ 中表示为 \\\\server1 以转义 '\' 我们必须再使用一个 '\'

于 2013-03-27T06:35:46.400 回答
0

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

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

并且名称必须是 format \\\\.\\pipe\\your_pipe_name。管道名称不区分大小写。

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

于 2016-08-25T04:05:44.147 回答