0

我正在尝试迭代我的机器(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 作为字符串?

4

0 回答 0