【问题标题】:Whats the difference between open and native handle in c#c#中的开放句柄和本机句柄有什么区别
【发布时间】:2022-09-26 12:15:53
【问题描述】:

我正在寻找两者之间的区别

IntPtr handle_1 = process.Handle;

获取关联进程的本机句柄。

[DllImport(\"kernel32.dll\", SetLastError = true)]
public static extern IntPtr OpenProcess(
     uint processAccess,
     bool bInheritHandle,
     uint processId
);
IntPtr handle_2 = OpenProcess(0x0010,false,process.Id);

如果函数成功,则返回值是指定进程的打开句柄。

两者都有不同的值。但我仍然可以用这些读取内存。我想了解这两者之间的区别,以防止出错。 我在上下文中使用它们:

 ReadProcessMemory(handle_x, addr, data, data.Length, IntPtr.Zero);

    标签: c# memory process handle


    【解决方案1】:

    两者都是进程句柄,因此可以以相同的方式使用。

    Process 对象通过其Handle 属性包含一个进程句柄。当您在该对象上调用 Dispose 时,您将关闭该句柄。

    当您在进程 ID 上调用 OpenProcess 时,您会得到一个不同的句柄(因此它具有不同的值)指的是同一进程。完成后必须单独关闭该句柄(使用 Win32 函数 CloseHandle):处理 Process 对象不会神奇地关闭您从 OpenProcess 获得的句柄。

    那么,当您已经在 Process 中拥有一个功能完善的句柄时,为什么还要调用 OpenProcess 呢?嗯,访问权限,真的。 Process获得的句柄拥有PROCESS_ALL_ACCESS(即完全访问权限)。如果您想要一个权限较少的句柄,您可以使用OpenProcess

    但实际上,在大多数情况下,当您需要进程句柄时,实际上并不需要使用原生 API。

    【讨论】:

    • 谢谢艾蒂安·德·马特尔。你的回答对我来说已经足够了。 :)
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多