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足以适应大多数情况。你也可以自由选择。