问题描述
我试图将EnumProcesses
与node-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,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_BUFFER_OUT_OF_BOUNDS]: Attempt to write outside buffer bounds
任何人都知道如何使用node-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 [];
}
}
}
我很努力地从指针获取数组数据,这是错误的,正如@ DrakeWu-MSFT在评论中说的那样,因为我没有为缓冲区分配足够的空间,因此无法向其中写入任何数据。使用ref-array
和指向数组的指针,它就像一个超级按钮。