c# - P/调用 CreateToolhelp32Snapshot 在 Compact Framework 中失败

标签 c# .net compact-framework windows-ce

嘿,我正在为我的智能手机开发一个小应用程序,使用的是 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 FrameworkOpenNETCF.ToolHelp namespace所有这些都已实现并正常工作(以防您不想重新发明轮子)。

关于c# - P/调用 CreateToolhelp32Snapshot 在 Compact Framework 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/393881/

相关文章:

c# - 如何通过 COM 互操作将字符串集合从 C# 返回到 C++

c# - DataTable AsEnumerable 匹配单个值

c# - 检查 Windows 窗体滚动条是否一直向下滚动?

compact-framework - 复制智能设备的logmein.com行为

compact-framework - 使用 c# 截取设备屏幕截图

c# - 如何检查 cobertura.xml 文件的代码/测试覆盖率是否高于指定阈值?

c# - 旋转 3d 模型 XAML c#

.net - 数据集应该驻留在 n 层(多层)架构中的什么位置?

.net - (TTFB) 某些特定请求花费的时间比执行实际请求的时间长

c# - 您将如何重构这段代码?