代码示例
调用动态链接库
安装node-gyp模块需要的环境的三种方式
- 安装Visual Studio 生成工具
- 直接使用Visual Studio
- 使用npm安装
sh
npm install --global --production windows-build-toolsjs
const ffi = require('ffi-napi');
const kernel32 = ffi.Library('kernel32', {
// const kernel32 = ffi.Library('my.dll', {
'Beep': ['int', ['int', 'int']]
// 'WinExec': ['int', ['String', 'int']]
// myFunc: ["int", ["int", "int"]],
})
kernel32.Beep(1000, 1000)
// kernel32.WinExec("app.exe",1);
// kernel32.WinExec("app.exe",1);
// kernel32.myFunc(1, 2)修改PE资源
- 使用rcedit
- 使用resedit和pe-library库
js
import * as ResEdit from 'resedit';
import * as PELibrary from 'pe-library';
import fs from 'fs';
let data = fs.readFileSync('app.exe');
let exe = PELibrary.NtExecutable.from(data, { ignoreCert: true });
let res = PELibrary.NtExecutableResource.from(exe);
let iconFile = ResEdit.Data.IconFile.from(fs.readFileSync('asus_republic_of_gamer.ico'));
ResEdit.Resource.IconGroupEntry.replaceIconsForResource(
res.entries,
1,//必须设置为1才有效
// 1033,
0,//必须设置为0,不然无法upx压缩
iconFile.icons.map((item) => item.data)
);
res.outputResource(exe);
let newBinary = exe.generate();
fs.writeFileSync('new.exe', Buffer.from(newBinary));修改程序的标题
js
// 推荐,跨平台,且同时修改终端窗口标题和系统任务管理器中的进程名
process.title = "我的 Node.js 程序";
// 不推荐
const { exec } = require("child_process");
exec('title 我的 Node.js 程序');