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
问题主要在标题中。我正在尝试使用此 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()
.
您可以使用 GetProcessId()
.