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 として表現して「\」をエスケープし、もう 1 つの「\」を使用する必要があります。

于 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);

名前は の形式である必要があります\\\\.\\pipe\\your_pipe_name。パイプの名前は大文字と小文字が区別されません。

これが良い例ですhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa365588(v=vs.85).aspx

于 2016-08-25T04:05:44.147 に答える