Вземете ID на процеса на клиент, който се е свързал към наименуван сървър с C#

Не съм сигурен дали просто не го виждам или какво? Трябва да знам идентификатора на процеса на клиент, който се е свързал чрез наименуван канал към моя сървър от екземпляр на 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