Winapi 如何在节点ffi中使用枚举进程

Winapi 如何在节点ffi中使用枚举进程,winapi,node-ffi,Winapi,Node Ffi,我试图将枚举进程与节点ffi一起使用。我得到的代码如下: import ffi from 'ffi' export const psapi = ffi.Library('psapi', { EnumProcesses: ['bool', ['ulong', 'ulong', 'uint16*']] }) export class Win32ProcessManager { public async getProcessList () { let lpidProcess =

我试图将
枚举进程
节点ffi
一起使用。我得到的代码如下:

import ffi from 'ffi'

export const psapi = ffi.Library('psapi', {
  EnumProcesses: ['bool', ['ulong', 'ulong', 'uint16*']]
})

export class Win32ProcessManager {
  public async getProcessList () {

    let lpidProcess = ref.alloc('ulong*')
    const cb = 1024
    const lpcbNeeded = ref.alloc('uint16*')

    const res = psapi.EnumProcesses(lpidProcess, cb, lpcbNeeded)

    const ulongSize = (ref as any).sizeof.ulong
    const totalBytesReturned = lpcbNeeded.readInt16LE()
    const processCount = totalBytesReturned / ulongSize
    console.log(`processCount: ${processCount}`)

    // ??? How to get the value from the lpidProcess?
    return lpidProcess
  }
}
我尝试了
ref.get
,但遇到了错误:

    let processId = ref.get(array, 0, ref.types.ulong)
    console.log(processId)
    const pointerSize = (ref as any).sizeof.pointer
    console.log(pointerSize)
    let processId2 = ref.get(array, (ref as any).sizeof.pointer, ref.types.ulong)
    console.log(processId2)
错误:

RangeError[ERR\u BUFFER\u OUT\u OF\u BOUNDS]:尝试在缓冲区边界外写入

有人知道如何使用
节点ffi
从dll读取数组数据吗?

谢谢@DrakeWu MSFT,我终于得到了我的代码,下面是它们的最终外观:

import ffi from 'ffi';
import ref from 'ref';
import ArrayType from "ref-array";

export const psapi = ffi.Library('psapi', {
  EnumProcesses: ['bool', ['ulong*', 'ulong', 'uint16*']],
});

export class Win32ProcessManager {

  public getProcessIdList (): number[] {
    const processIdLength = 1024;
    const ulongSize = (ref as any).sizeof.ulong;
    const cb = processIdLength * ulongSize;
    let processIdArray = ArrayType('ulong', processIdLength);
    let lpidProcess = ref.alloc(processIdArray);
    const lpcbNeeded = ref.alloc('uint16*');

    const res = psapi.EnumProcesses(lpidProcess, cb, lpcbNeeded);

    if (res) {
      const totalBytesReturned = lpcbNeeded.readInt16LE();
      const processCount = totalBytesReturned / ulongSize;
  
      const processArray = (lpidProcess as any).deref();
      let resultProcessArray: number[] = [];
      for (let i = 0; i < processCount; i++) {
        resultProcessArray.push(processArray[i]);
      }
  
      return resultProcessArray;
    } else {
      console.error(`Get process list failed with result from EnumProcess: ${res}`);
      return [];
    }
  }
}

从“外国金融机构”导入外国金融机构;
从“ref”导入ref;
从“ref array”导入ArrayType;
导出常量psapi=ffi.Library('psapi'{
枚举进程:['bool',['ulong*','ulong','uint16*'],
});
导出类Win32ProcessManager{
公共getProcessIdList():编号[]{
const processIdLength=1024;
const-ulongSize=(如有参考)。sizeof.ulong;
const cb=进程长度*ulongSize;
让processIdArray=ArrayType('ulong',processIdLength);
设lpidProcess=ref.alloc(processIdArray);
const lpcbNeeded=ref.alloc('uint16*');
const res=psapi.enumprocess(需要lpidProcess、cb、lpcb);
如果(res){
const totalBytesReturned=lpcbNeeded.readInt16LE();
const processCount=totalBytesReturned/ulongSize;
const processArray=(lpidProcess as any).deref();
let resultprocessay:number[]=[];
for(设i=0;i

我很难从指针获取数组数据,正如@DrakeWu MSFT在评论中所说的那样,这是错误的,因为我没有为缓冲区分配足够的空间,没有数据可以写入其中。使用
ref-array
和指向数组的指针,它就像一个符咒一样工作。

您需要使用足够大的数组而不是指针(只能包含1个元素),因为很难预测在调用
EnumProcesses
时将有多少个进程。顺便说一句,您已将参数类型声明为
ulong
,但传递了一个
ulong*
,也许您可以使用
ref array
,然后将每个元素的count\u数组*sizeof\u作为第二个参数。@DrakeWu MSFT感谢您的评论!你救了我的命!我昨天花了一整天的时间来解决这个.NP,你可以分享并发布你的解决方案作为答案,你可以随意接受自己。最后发布的代码:PA小问题,
cb
应该是数组的长度(1024)*ulongSize,尽管1024足以适应大多数情况。你也可以自由选择。