我试图理解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;
不成功。它将错误记录为"cannot get content of undefined size"
我在c++和javascript之间错过了什么?我如何在javascript打印subjectName ?
我认为你在做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);
this spits out
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();