Maison > développement back-end > C++ > Comment obtenir de manière fiable un ID de processus parent dans .NET en utilisant le code géré?

Comment obtenir de manière fiable un ID de processus parent dans .NET en utilisant le code géré?

Barbara Streisand
Libérer: 2025-01-28 05:31:15
original
667 Les gens l'ont consulté

How to Reliably Get a Parent Process ID in .NET Using Managed Code?

Récupération de l'ID de processus parent dans .NET: une solution robuste

Le défi:

Trouver une méthode systématiquement fiable pour obtenir l'ID de processus parent d'un processus dans les applications .NET s'est avérée difficile. De nombreuses approches existantes dépendent des appels spécifiques à la plate-forme (P / Invoke), qui peuvent être complexes et moins portables.

Une solution robuste utilisant p / invoke:

Malgré les complexités, une solution P / Invoke bien structurée offre une fiabilité exceptionnelle sur des systèmes 32 bits et 64 bits:

<code class="language-csharp">public static class ParentProcessHelper
{
    [DllImport("ntdll.dll")]
    private static extern int NtQueryInformationProcess(IntPtr processHandle, int processInformationClass, ref PROCESS_BASIC_INFORMATION processInformation, int processInformationLength, out int returnLength);

    public static Process GetParentProcess()
    {
        return GetParentProcess(Process.GetCurrentProcess().Handle);
    }

    public static Process GetParentProcess(int processId)
    {
        Process process = Process.GetProcessById(processId);
        return GetParentProcess(process.Handle);
    }

    public static Process GetParentProcess(IntPtr handle)
    {
        PROCESS_BASIC_INFORMATION pbi = new PROCESS_BASIC_INFORMATION();
        int returnLength;
        int status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out returnLength);
        if (status != 0)
            throw new Win32Exception(status);

        try
        {
            return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32());
        }
        catch (ArgumentException)
        {
            return null; // Parent process not found
        }
    }

    // Structure definition (required for P/Invoke)
    [StructLayout(LayoutKind.Sequential)]
    private struct PROCESS_BASIC_INFORMATION
    {
        public IntPtr Reserved1;
        public IntPtr PebBaseAddress;
        public IntPtr Reserved2;
        public IntPtr Reserved3;
        public IntPtr UniqueProcessId;
        public IntPtr InheritedFromUniqueProcessId;
    }
}</code>
Copier après la connexion

Cette méthode raffinée identifie efficacement le processus parent pour votre application .NET ou tout ID de processus spécifié. La gestion des erreurs est incluse pour gérer gracieusement les situations où le processus parent ne fonctionne plus. Notez que la structure PROCESS_BASIC_INFORMATION est cruciale pour une interopérabilité correcte avec la fonction native NtQueryInformationProcess.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal