1

我试图了解 C++ dll 和 JavaScript 之间的关系。有一段js代码:

cert = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);

其中 cert 定义为

let cert = null;

但是在 C++ 中, cert 是一个结构

CERTCertificateStr {
    char *subjectName;
    char *issuerName;
    SECItem derCert;            /* original DER for the cert */
    .... }

我正在尝试在 javascript 中获取主题名称,然后继续使用代码

let a = cert.contents.subjectName; 

这是不成功的。它将错误记录为“无法获取未定义大小的内容”

我在 C++ 和 javascript 之间错过了什么?如何在 javascript 中打印 subjectName?

4

1 回答 1

0

我认为您正在做 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

另外,您说函数返回一个结构,它是否返回指向该结构的指针?或者实际上是结构?我认为它返回一个指向 struct no 的指针?所以在这种情况下你会这样做:

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();
于 2015-06-10T05:59:58.920 回答