2013-03-16 32 views
2

代碼片段:CreateNamedPipe時ERROR_INVALID_NAME

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

你忽略了警告吧?大多數程序員通常的做法,不知道爲什麼! – Ajay 2013-03-27 07:10:51

回答

5

你需要躲避字符串字面的反斜槓被用於管道名稱:

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

我發現在發佈後18秒內,謝謝。 – Avery3R 2013-03-16 20:53:25

2

你應該逃脫你的背部斜線:)

1

如果使用正斜槓/在你的路你代碼將更具可讀性,並且您將避免這樣的錯誤。

很多人似乎並不知道Windows接受/和\作爲目錄分隔符。

0

是,以同樣的方式對網絡股也一樣\\ server1的,我們必須在C++中表示爲\\\\ server1的 逃脫「\」,我們必須使用一個更「\」