2008-12-26 82 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它解決了我的問題。

相關問題