64 lines
1.7 KiB
JavaScript
64 lines
1.7 KiB
JavaScript
|
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
|
||
|
};
|