CreateToolhelp32Snapshot中使用的th32ProcessID是句柄

Is th32ProcessID used in CreateToolhelp32Snapshot a handle

问题主要在标题中。我正在尝试使用此 method 编写一个示例,但是当我 运行 它带有 ALL 标志和进程句柄时,我返回 -1 而不是快照的有效句柄,并且在调用时GetLastError 我得到 2(系统找不到指定的文件。)

我的问题是 MSDN link 中引用的 th32ProcessID 是指正常的进程句柄还是有不同的方法来获取此进程 ID?

目前我没有大量的代码,但我有以下代码:

[DllImport("kernel32", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
internal static extern IntPtr CreateToolhelp32Snapshot([In] SnapshotFlags dwFlags, [In] IntPtr th32ProcessID);

IntPtr Handle = CreateToolhelp32Snapshot(SnapshotFlags.All, ProcessHandle);

Console.WriteLine("ProcessHandle = {0}", ProcessHandle.ToString("X"));
uint flags = 0;
bool result = GetHandleInformation(ProcessHandle, out flags);
Console.WriteLine("Last error = {0} and handle is valid = {1}", WinErrors.GetLastWin32Error(), result);
Console.WriteLine((int)Handle);

进程 HANDLE 与进程 ID 不同。它们不可互换。

CreateToolhelp32Snapshot() 采用进程 ID。该参数是 DWORD,因此您应该使用 (u)int(又名 (U)Int32),而不是 IntPtr

GetHandleInformation() 需要一个进程 HANDLE。

由于您将错误类型的参数值传递给 CreateToolhelp32Snapshot(),它失败了,返回 INVALID_HANDLE_VALUE,然后 GetLastError() 告诉您指定的进程 ID 不是找到了。

您可以使用 OpenProcess().

从进程 ID 获取进程 HANDLE

您可以使用 GetProcessId().

从进程 HANDLE 中获取进程 ID