我正在尝试迭代我的机器(Windows)中存在的字体并实现我正在通过 ffi 在 javascript 文件中从gdi32.dll访问EnumFontFamiliesExA方法,如下所示:
索引.js
var ffi = require('ffi');
var ref = require('ref');
var ArrayType = require('ref-array');
const { LogFontAPtr, LogFontA } = require('./logFontA');
const { TextMetricAPtr, TextMetricA } = require('./textMetricA');
const stringArray = ArrayType(ref.types.CString);
var myObjPtr = ref.refType(stringArray);
var callback = ffi.Callback('int', [LogFontAPtr, TextMetricAPtr, 'int', myObjPtr],
function(logFont, txtMetric, fontType, lParam) {
try {
const output = logFont.deref();
console.log(output.lfFaceName);
}
catch (ex) {
console.log('Exception');
console.error(ex);
}
});
var userLib = ffi.Library('user32', {
'GetActiveWindow': ['int', []],
'GetDC': ['pointer', ['int']]
});
var gdiLib = ffi.Library('gdi32', {
'EnumFontFamiliesExA': ['int', ['pointer', LogFontAPtr, 'pointer', myObjPtr, 'int']]
});
var lfA = new LogFontA();
lfA.lfFaceName[0] = '\0';
lfA.lfCharSet = 1;
var fL = new stringArray(300);
gdiLib.EnumFontFamiliesExA(userLib.GetDC(userLib.GetActiveWindow()), lfA.ref(), callback, fL.buffer, 0);
// Make an extra reference to the callback pointer to avoid GC
process.on('exit', function() {
callback
});
LogFontA.js - 通过ref-struct包创建的结构并将lfFaceName定义为“ ref.types.char ”(参考自:https ://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns- wingdi-logfonta?redirectedfrom=MSDN )
var StructType = require('ref-struct');
var ref = require('ref');
const ArrayType = require('ref-array');
var LogFontA = StructType({
lfHeight: ref.types.long,
lfWidth: ref.types.long,
lfEscapement: ref.types.long,
lfOrientation: ref.types.long,
lfWeight: ref.types.long,
lfItalic: ref.types.byte,
lfUnderline: ref.types.byte,
lfStrikeOut: ref.types.byte,
lfCharSet: ref.types.byte,
lfOutPrecision: ref.types.byte,
lfClipPrecision: ref.types.byte,
lfQuality: ref.types.byte,
lfPitchAndFamily: ref.types.byte,
lfFaceName: ref.types.char
});
var LogFontAPtr = ref.refType(LogFontA);
module.exports = { LogFontA, LogFontAPtr }
当我运行 index.js 代码并尝试打印lfFaceName时,它会将其打印为83。我尝试将其类型转换为 ArrayType(ref.types.char),但无法使其正常工作。
如何获取 lfFaceName 作为字符串?