2008-12-26 83 views
1

嘿,即时通讯使用Windows Mobile 6为我的智能手机做一个小应用程序。我尝试获取所有当前正在运行的processec,但方法CreateToolhelp32Snapshot总是返回-1。所以现在我卡住了。我试图通过调用GetLastError()方法来获取错误,但该方法返回0值。 这是我的代码片段。P /在Compact Framework中调用CreateToolhelp32Snapshot失败

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); 
+0

“if((int)handle> 0)”不正确;你应该使用“if(handle!= -1)”。您的声明是否CreateToolhelp32Snapshot始终返回-1字面为true,或者您是否根据您的代码声明它为已发布?你可能会得到一个不合格的句柄,而这个句柄不合格。 – atzz 2008-12-26 16:12:06

回答

3
  • 首先,你的句柄检查是错误的。高位位在句柄中很常见,导致它在转换为带符号整数时看起来像负数。你应该检查它是不是NULL(0)或INVALID_HANDLE_VALUE(-1/0xffffffff)。
  • 您不应该“调用GetLastError”,而是调用Marshal.GetLastWin32Error()
  • 您尚未在P/Invoke声明中设置SetLastError属性。在C#中,它默认为false,在VB中默认为true。
  • 您的PROCESS32实施在哪里? docs clearly state dwLength成员必须在通话之前设置,并且在此处不清楚是否发生了这种情况。

作为一个侧面说明,Smart Device FrameworkOpenNETCF.ToolHelp namespace拥有这一切的实现和工作(如果你不想推倒重来)。

+0

OpenNETCF.ToolHelp不适用于我。它引发“无法创建快照”。幸运的是,[ProcessCE类](http://www.codeproject。com/Articles/36841/Compact-Framework-Process-class-that-supports-full)为我完成这项工作。 – 2013-06-17 08:37:30

0

如果你没有看到有效的“最后的错误”的信息,也许你可能需要增加对API的DllImport属性(MSDN reference with code examples)的“SetLastError”属性。根据此属性的文件,你应该设置SetLastError到...

... true指示被叫方将 呼叫SetLastError;否则,是错误的。 默认值为false。

封送调用 GetLastError函数和缓存值 运行时回到防止它被 其他API调用覆盖。您 可以通过调用 GetLastWin32Error

至于你所看到的,我没有发现任何明显的副手的API故障检索错误代码;您所看到的代码与示例代码here非常相似。

1

而不是

CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

使用

private const int TH32CS_SNAPNOHEAPS = 0x40000000; 
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0); 

默认CreateToolHelp32Snapshot函数将尝试快照的堆和可能会导致内存不足的错误。

发现这在https://social.msdn.microsoft.com/Forums/en-US/e91d845d-d51e-45ad-8acf-737e832c20d0/createtoolhelp32snapshot-windows-mobile-5?forum=vssmartdevicesnative它解决了我的问题。

相关问题