如何使用 EnumProcesses 在 Dart (Windows) 中获取进程 PID

How get process PID in Dart (Windows) with EnumProcesses

我可以创建函数从 PID 获取路径,但现在我必须获取进程 PID。

String _getProcessPath(int processID) {
  var path = '';
  var hProcessHandle = OpenProcess(
      PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
  var lpFilename =
      '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
          .toNativeUtf16();
  var nSize = MAX_PATH;

  GetModuleFileNameEx(hProcessHandle, NULL, lpFilename, nSize);
  path = lpFilename.toDartString();
  CloseHandle(hProcessHandle);
  free(lpFilename);
  return path;
}

我知道首先我需要 EnumProcesses 并且在那里我可以获得 PID,但是在 dart 2.12.0 上我误解了如何调用它。互联网使用的几个例子 allocate,在当前 ffi 中不存在。

numProcesses(Pointer<Uint32> lpidProcess, int cb, Pointer<Uint32> lpcbNeeded)

需要指针,但我不知道如何在不分配的情况下创建它。

需要帮助,谢谢。

您可以在完全不影响 FFI 的情况下完成此操作。只需 运行 Windows cmd 程序 tasklist 并解析输出。

(我目前没有坐在 Windows 电脑前进行测试,但它应该非常接近准确。)

import 'dart:io';
import 'dart:convert';

Future<Map<String, int>> getPids() async {
  final tasklistProc = Process.run('START', ['/B', 'tasklist', '/NH', '/FO', 'csv']);
  final stream = tasklistProc.stdout.transform(utf8.decoder).transform(LineSplitter());
  
  final pids = <String, int>{};
  await for (var line in stream) {
    final elems = line.split(',').map((elem) => elem.replaceAll('"', '')).toList();
    
    final name = elems[0];
    final pid = int.parse(elems[1]);
//     final session = elems[2];
//     final sessionNumber = int.parse(elems[3]);
//     final memUsage = elems[4];
    
    pids[name] = pid;
  }
  
  return pids;
}

allocate 替换为 calloc:

final Pointer<Uint32> aPointer = calloc<Uint32>();
// Code using it goes here.
calloc.free(aPointer);

谢谢,用 calloc.allocate() 方法搞定了。