XNSim/XNSimHtml/modules/cleanup.js

64 lines
1.7 KiB
JavaScript
Raw Normal View History

2025-04-28 12:25:20 +08:00
const ffi = require('ffi-napi');
const ref = require('ref-napi');
const path = require('path');
const os = require('os');
// 获取XNCore环境变量
const xnCorePath = process.env.XNCore || '';
// 根据操作系统类型确定动态库扩展名和路径
const isWindows = os.platform() === 'win32';
const libExtension = isWindows ? '.dll' : '.so';
const libPrefix = isWindows ? '' : 'lib';
const libName = `${libPrefix}Login${libExtension}`;
const libPath = path.join(xnCorePath, 'lib', libName);
// 定义Buffer类型
const BufferType = ref.refType(ref.types.void);
const StringType = ref.types.CString;
// 定义动态库函数接口
let loginLib;
try {
loginLib = ffi.Library(libPath, {
'validateUser': ['int', [BufferType, 'size_t', BufferType, 'size_t']],
'getUserInfo': [StringType, ['int']],
'cleanup': ['void', []],
'registerUser': ['int', [BufferType, 'size_t', BufferType, 'size_t', BufferType, 'size_t']]
});
} catch (error) {
console.error(`加载 ${libName} 失败:`, error);
}
// 注册进程退出时的清理函数
function performCleanup() {
console.log('正在执行清理操作...');
if (loginLib) {
try {
loginLib.cleanup();
console.log('清理操作完成');
} catch (error) {
console.error('清理操作失败:', error);
}
}
}
// 转换字符串为Buffer的函数
function stringToBuffer(str) {
try {
if (!str) {
return { buffer: Buffer.alloc(0), length: 0 };
}
const buffer = Buffer.from(str, 'utf8');
return { buffer: buffer, length: buffer.length };
} catch (error) {
console.error('字符串转Buffer失败:', error);
return { buffer: Buffer.alloc(0), length: 0 };
}
}
module.exports = {
loginLib,
performCleanup,
stringToBuffer
};