NodeJS: node-ffi, ref-struct, ref-array
NodeJS: node-ffi, ref-struct, ref-array
我正在使用nodejs插件ffi
, ref
, ref-struct
和ref-array
编写PKCS11加密包装器。我有这个代码。
var hSession = this.session.handle;
var hObject = this.handle;
var $label = new (arrayType(cki.CK_UTF8CHAR))(80);
var template = new (arrayType(cki.CK_ATTRIBUTE))(1);
template[0] = new cki.CK_ATTRIBUTE({
type:cki.CKA_LABEL,
pValue: $label.ref(),
ulValueLen: 80})
var res = this.cki.C_GetAttributeValue(hSession, hObject, template.ref(), 1);
if (res == cki.CKR_OK) {
console.log("Ok");
}
else{
console.log("Wrong "+res);
}
当我调用这个函数时,我有错误的结果(CKR_ARGUMENTS_BAD, CKR_ATTRIBUTE_TYPE_INVALID)。请帮我找出错误。
FFI函数
"C_GetAttributeValue":[t.CK_RV, [t.CK_SESSION_HANDLE, t.CK_OBJECT_HANDLE, t.CK_ATTRIBUTE_PTR, t.CK_ULONG]],
类型/* CK_ATTRIBUTE is a structure that includes the type, length
* and value of an attribute */
t.CK_ATTRIBUTE = struct({
type: t.CK_ATTRIBUTE_TYPE,
pValue: t.CK_VOID_PTR,
/* ulValueLen went from CK_USHORT to CK_ULONG for v2.0 */
ulValueLen: t.CK_ULONG /* in bytes */
});
(评论中的讨论记录)
使用纯Buffer
提供缓冲区来存储属性值:
var $label = new Buffer(80);
按如下方式在结构中传递它:
template[0] = new cki.CK_ATTRIBUTE({
type:cki.CKA_LABEL,
pValue: $label,
ulValueLen: $label.length})
然后使用$label.toString('utf8',0,<ulValueLen>)
来获得实际的字符串。
注意:我不精通节点FFI,但这种方法似乎只是工作。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 将Ref对象作为类成员
- 为什么我的 std::ref 无法按预期工作?
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何@ref同一方法的不同变体?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 为什么要用 ref-qualifier 和
- 将 ArrayXd 传递给 const VectorXd& 和 const Ref<const VectorXd>&
- 返回 Eigen::Ref 合法吗?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 在与Odint组合的类中使用特征矩阵Ref
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 带有自定义deleter的std::unique_ptr对象的大小(一个由ref捕获的lambda)
- 正在通过const-ref未定义的行为捕获新构造的对象
- C++将包含的库 (ref DLL) 从根目录更改为另一个位置
- 无法修改其他线程中 ref 传递的值
- NodeJS: node-ffi, ref-struct, ref-array