代码段:
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
,我无法弄清楚原因。
答案 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