首頁 > 後端開發 > C++ > 如何使用託管代碼可靠地獲取.NET中的父進程ID?

如何使用託管代碼可靠地獲取.NET中的父進程ID?

Barbara Streisand
發布: 2025-01-28 05:31:15
原創
628 人瀏覽過

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

>檢索.NET中的父進程ID:一個可靠的解決方案

挑戰:

找到一種始終可靠的方法以在.NET應用程序中獲取流程的父進程ID已被證明很困難。 許多現有的方法取決於特定於平台的調用(P/Invoke),這可能是複雜且便攜式的。 使用P/Invoke:>

>一個可靠的解決方案 儘管有復雜性,但結構良好的P/Invoke解決方案可在32位和64位系統上提供出色的可靠性:

此精製方法有效地標識了您的.NET應用程序或任何指定的過程ID的父進程。 包括錯誤處理,以優雅地管理父過程不再運行的情況。 請注意,

struct對於與本機
<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>
登入後複製
函數的正確互操作性至關重要。

>

以上是如何使用託管代碼可靠地獲取.NET中的父進程ID?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板