Получить идентификатор процесса клиента, который подключился к серверу именованных каналов с помощью С#

Я не уверен, я просто не вижу этого или что? Мне нужно знать идентификатор процесса клиента, который подключился через именованный канал к моему серверу из экземпляра 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, которую я использую здесь.


person c00000fd    schedule 09.04.2013    source источник
comment
Каков ваш вопрос/проблема на самом деле?   -  person ken2k    schedule 09.04.2013
comment
Хочешь знать, правильно ли это? Или что?   -  person Ben    schedule 09.04.2013
comment
Меня больше всего беспокоит то, что они называют DangerousGetHandle.   -  person c00000fd    schedule 09.04.2013
comment
Нет проблем с использованием DangerousGetHandle.   -  person David Heffernan    schedule 09.04.2013


Ответы (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;
}
person David Heffernan    schedule 09.04.2013
comment
Спасибо. Но я подумал, что это избыточно, так как я установил nProcID в 0 в начале. - person c00000fd; 09.04.2013
comment
Что ж, компилятор должен был предупредить вас, что значение, присвоенное nProcID в присваивании до try, никогда не использовалось. Во всяком случае, функции Win32 не сигнализируют об ошибках исключениями. Они сигнализируют об ошибках через свои возвращаемые значения. - person David Heffernan; 09.04.2013