嘿,我正在为我的智能手机开发一个小应用程序,使用的是 Windows Mobile 6。我正在尝试获取所有当前正在运行的进程,但是方法 CreateToolhelp32Snapshot 总是返回 -1。所以现在我卡住了。我试图在调用 GetLastError() 方法时出错,但该方法返回 0 值。 这是我的代码片段。
private const int TH32CS_SNAPPROCESS = 0x00000002;
[DllImport("toolhelp.dll")]
public static extern IntPtr CreateToolhelp32Snapshot(uint flags,
uint processid);
public static Process[] GetProcesses()
{
ArrayList procList = new ArrayList();
IntPtr handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ((int)handle > 0)
{
try
{
PROCESSENTRY32 peCurr;
PROCESSENTRY32 pe32 = new PROCESSENTRY32();
// get byte array to pass to API call
byte[] peBytes = pe32.ToByteArray();
// get the first process
int retval = Process32First(handle, peBytes);
最佳答案
- 首先,您的句柄检查有误。高位在句柄中是很常见的,导致它在转换为带符号的 int 时看起来像负数。您应该检查它不是 NULL (0) 或 INVALID_HANDLE_VALUE (-1/0xffffffff)。
- 您不应该“调用 GetLastError”,而应该调用 Marshal.GetLastWin32Error()
- 您没有在 P/Invoke 声明中设置 SetLastError 属性。在 C# 中它默认为 false,在 VB 中它默认为 true。
- 您的 PROCESS32 实现在哪里? docs clearly state dwLength 成员必须在调用之前设置,这里不清楚是否会发生这种情况。
作为旁注,Smart Device Framework的 OpenNETCF.ToolHelp namespace所有这些都已实现并正常工作(以防您不想重新发明轮子)。
关于c# - P/调用 CreateToolhelp32Snapshot 在 Compact Framework 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/393881/