首頁 > 後端開發 > C++ > 如何在不使用P/Invoke的情況下將父進程獲取.NET?

如何在不使用P/Invoke的情況下將父進程獲取.NET?

Linda Hamilton
發布: 2025-01-28 05:12:10
原創
381 人瀏覽過

How to Get the Parent Process in .NET Without Using P/Invoke?

在.NET中獲取父進程,無需P/Invoke

在.NET中獲取父進程是一個常見任務,可以使用平台調用(P/Invoke)方法實現。但是,本文介紹了一種替代方案,無需使用P/Invoke。

此方案利用ntdll.dll庫中的NtQueryInformationProcess函數,但它不直接通過P/Invoke與之交互,而是利用ParentProcessUtilities類來抽象該進程。

<code class="language-csharp">[StructLayout(LayoutKind.Sequential)]
public struct ParentProcessUtilities
{
    // 这些成员必须与PROCESS_BASIC_INFORMATION匹配
    internal IntPtr Reserved1;
    internal IntPtr PebBaseAddress;
    internal IntPtr Reserved2_0;
    internal IntPtr Reserved2_1;
    internal IntPtr UniqueProcessId;
    internal IntPtr InheritedFromUniqueProcessId;
}</code>
登入後複製

ParentProcessUtilities類包含靜態方法,例如GetParentProcess,它接受一個進程句柄並返回表示父進程的Process類的實例。

<code class="language-csharp">public static Process GetParentProcess(IntPtr handle)
{
    ParentProcessUtilities pbi = new ParentProcessUtilities();
    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;
    }
}</code>
登入後複製

NtQueryInformationProcess函數檢索指定進程的基本信息,包括繼承的進程ID。通過查詢此信息並將其轉換為Process實例,此方案允許在託管代碼中輕鬆檢索父進程,而無需使用P/Invoke。

以上是如何在不使用P/Invoke的情況下將父進程獲取.NET?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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