Я пытаюсь понять связь между C ++ DLL и JavaScript.
Существует код JS:
cert = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);
где сертификат определяется как
let cert = null;
Однако в C ++ сертификат является структурой
CERTCertificateStr {
char *subjectName;
char *issuerName;
SECItem derCert; /* original DER for the cert */
.... }
Я пытаюсь получить имя субъекта в JavaScript, и я продолжаю код с
let a = cert.contents.subjectName;
Это неудачно. Он регистрирует ошибку как «не может получить содержимое неопределенного размера»
Что-нибудь, что я пропустил между C ++ и javascript?
Как я могу напечатать subjectName в JavaScript?
Я думаю, что вы делаете jsctypes, и вы на правильном пути. Чтобы получить строку JS, хотя вы должны пометить readString()
после приведения его к массиву определенной длины можно перейти к фактической длине как readString()
будет читать до первого нулевого символа, который \x00
, Хотя, если вы знаете точную длину, которая всегда лучше (вам не нужно указывать длину + 1 для нулевого члена), потому что тогда вы экономите память, поскольку вам не нужно излишне выделять буфер (массив в случае jsctypes) больше необходимой длины.
Так что попробуйте это:
let a = ctypes.cast(cert.contents.subjectName, ctypes.char.array(100).ptr).contents.readString();
console.log('a:', a);
Ошибка cannot get contents of undefined size
происходит в таких ситуациях:
var a = ctypes.voidptr_t(ctypes.char.array()('rawr'))
console.log('a:', a.contents);
это выплевывает
Error: cannot get contents of undefined size
Итак, чтобы исправить это, мы делаем следующее:
var b = ctypes.cast(a, ctypes.char.array(5).ptr)
console.log('b:', b.contents);
и это успешно получает доступ к содержимому, оно дает нам (кстати, я использовал 5 для длины, которая составляет 4 для длины rawr
+1 для нулевого терминатора, но я действительно не должен был делать это, я мог бы использовать длину всего 4)
CData { length: 5 }
так что теперь мы можем прочитать contents
как строка JS, как это:
console.log('b:', b.contents.readString());
и это выплевывает:
rawr
ТАКЖЕ, вы сказали, что функции возвращают структуру, она возвращает указатель на структуру? Или на самом деле структура? Я думаю, что он возвращает указатель на структуру нет? так что в этом случае вы бы сделали это:
let certPtr = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);
let certStruct = ctypes.StructType('CERTCertificateStr', [
{'subjectName': ctypes.char.ptr},
{issuerName: ctypes.char.ptr},
{derCert: ctypes.voidptr_t}
]);
let cert = ctypes.cast(certPtr, certStruct.ptr).contents;
let a = cert.contents.subjectName.readString();