P /在Compact Framework中调用CreateToolhelp32Snapshot失败

嘿,我正在为我的智能手机做一个小应用程序,使用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实现在哪里? 文档明确指出dwLength成员必须在调用之前设置,并且不清楚这是否正在发生。

作为旁注, 智能设备框架的OpenNETCF.ToolHelp命名空间已经实现并且正常工作(如果您不想重新发明轮子)。

代替

 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找到了它,它解决了我的问题。

如果您没有看到有效的“上次错误”信息,可能您可能需要在API的DllImport属性( 带代码示例的MSDN参考 )上添加“SetLastError”属性。 根据此属性的文档,您应该将SetLastError设置为…

… true表示被调用者将调用SetLastError; 否则,是的。 默认值为false。

运行时封送程序调用GetLastError并缓存返回的值,以防止其被其他API调用覆盖。 您可以通过调用GetLastWin32Error来检索错误代码

至于你看到的API失败,我没有发现任何明显的副作用; 您拥有的代码似乎与此处的示例代码非常相似。