C# 互操作 GetNamedPipeClientProcessId ERROR_NOT_FOUND 1168 (0x490)

C# Interop GetNamedPipeClientProcessId ERROR_NOT_FOUND 1168 (0x490)

我不明白为什么会收到 ERROR_NOT_FOUND / 1168 (0x490) 错误代码。如果我将 GetNamedPipeClientProcessId 替换为 GetNamedPipeServerProcessId,我就成功获取了服务器的进程 ID。

代码:

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool GetNamedPipeClientProcessId(IntPtr Pipe, out int ClientProcessId);

int GetNamedPipeClientProcessId(NamedPipeServerStream pipeServer)
{
   var hPipe = pipeServer.SafePipeHandle.DangerousGetHandle();

    if (GetNamedPipeClientProcessId(hPipe, out var clientProcessId))
    {
        return clientProcessId;
    }
    else
    {
        var error = Marshal.GetLastWin32Error();
        return 0;
    }
}

您需要在客户端调用 CallNamedPipe or CreateFile 连接到名称管道后调用 GetNamedPipeClientProcessId。如果客户端未连接到名称管道,GetNamedPipeClientProcessId 将失败并显示 ERROR_NOT_FOUND(0x490)。