1

見ていないだけなのか、それとも何なのかよくわかりません。のインスタンスから名前付きパイプを介してサーバーに接続したクライアントのプロセス ID を知る必要がありますNamedPipeServerStream。そのようなことは可能ですか?

その間、私はこの機能を思いつきました:

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool GetNamedPipeClientProcessId(IntPtr Pipe, out UInt32 ClientProcessId);
public static UInt32 getNamedPipeClientProcID(NamedPipeServerStream pipeServer)
{
    //RETURN:
    //      = Client process ID that connected via the named pipe to this server, or
    //      = 0 if error
    UInt32 nProcID = 0;
    try
    {
        IntPtr hPipe = pipeServer.SafePipeHandle.DangerousGetHandle();
        GetNamedPipeClientProcessId(hPipe, out nProcID);
    }
    catch
    {
        //Error
        nProcID = 0;
    }

    return nProcID;
}

私は「DangerousGetHandles」と「DllImports」があまり得意ではありません。ここで使用している Win32 の方がはるかに優れています。

4

1 に答える 1

1

そのコードの主な問題は、正しいエラー処理を実行しないことです。GetNamedPipeClientProcessIdエラーを検出するには、の戻り値を確認する必要があります。

[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool GetNamedPipeClientProcessId(IntPtr Pipe, out uint ClientProcessId);
public static uint getNamedPipeClientProcID(NamedPipeServerStream pipeServer)
{
    UInt32 nProcID;
    IntPtr hPipe = pipeServer.SafePipeHandle.DangerousGetHandle();
    if (GetNamedPipeClientProcessId(hPipe, out nProcID))
        return nProcID;
    return 0;
}
于 2013-04-09T09:01:58.363 に答える