问题标签 [ref-struct]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1676 浏览

node.js - 如何从node-ffi创建的长度为0的nodejs缓冲区读取数据

我正在尝试使用 node-ffi 包装现有的 C 库,但我似乎无法读取返回的结果。情况有点尴尬,因为函数返回的是 C 结构体

表示 datum.ptr 的节点缓冲区的长度字段为 0。

这是显示该问题的整个 C 代码。

这是javascript:

这是输出:

请注意 p->ptr 和缓冲区都说 0x103b02e20 所以我认为数据在那里,我只是因为某种原因无法从缓冲区中读取它。

有人知道我缺少什么吗?

0 投票
0 回答
699 浏览

node.js - 如何使用带有 `ffi`、`ref-struct` 和 `ref-array` 的复杂数据结构?

我正在开发一个用于ffi与已编译的 C 库进行交互的项目。我试图让一些复杂的数据结构工作,并且在找出在这些数据结构中获取值的正确方法时遇到问题。我有两个例子我想弄清楚。我不是C 人,所以我在这方面发挥了作用。

实例 1

有一个 Cstruct包含一些属性,这些属性看起来像指向字符数组的指针。这是定义的 C 代码struct

现在,我已经能够成功提取E_CALL_STATE属性,BOOL但我很难将字符串存储在cPhoneNumbercNamecCallIdcPreviousCallId. 这是我使用它进行设置的方式ref-struct

这是解释这一点的Javascript struct(供参考,RPC_CALL_STATE是外部定义的enum):

如果我查看存储在 上的值callProgressStruct.cPhoneNumber,我会得到0。所以,有几个问题:

  • 在这里使用什么是正确ref.types的?
    • 是否char正确?
    • 如果不是,这应该是什么?
  • 如何提取存储在中的实际字符串值cPhoneNumber
  • 有没有办法在ref-array这里使用?

实例 2

我有一个struct这样定义的C:

在这段代码中,*pDevices最终成为一个AUDIO_OS_DEVICE结构数组。这些结构在 C 中定义为:

在 Javascript 我有这个设置使用ref-struct

不知道pDevices要在这里转换什么类型,也不知道如何提取AUDIO_OS_DEVICE结构数组。我遇到了已经用字符数组描述的问题。

任何帮助,将不胜感激。在我弄清楚这一点之前,我处于死胡同。

0 投票
0 回答
507 浏览

javascript - 结构数组作为 OUT 参数从 C 到 JS 使用 node-ffi、ref-array 和 ref-struct

我正在使用 node-ffi 将 JS 与 C 库集成。我想出了将复杂结构作为 IN 参数传递并获得单个结构作为 OUT 参数的方法。但是,我无法从 C 中成功获取结构数组并在 JS 中对其进行迭代。我有以下 C 结构和 API。

我已经在 J​​S 端模拟它并调用 C API 如下

我可以打印并检查值是否在 C 内部的 out 参数中正确填充。但我无法在 JS 端打印值。它要么因 Seg 故障而失败或未定义。

任何建议都会有很大帮助!

0 投票
1 回答
1981 浏览

c# - 为什么 ref 结构不能用作类型参数?

C# 7.2引入了 ref structs。但是,给定一个ref struct这样的:

我不能将它用作类型参数:

我知道 ref 结构只能存在于堆栈上,而不能存在于堆上。但是,如果保证使用此类 ref 结构的泛型方法永远不会将它们放在堆上,就像上面使用System.Runtime.CompilerServices.Unsafe包的示例中那样?为什么在这些情况下我不能将它们用作类型参数?

0 投票
2 回答
262 浏览

c# - 如何使用 xUnit 测试 ref struct 方法是否抛出异常?

我是 xUnit 的新手,但据我所知,检查某事是否引发异常的标准方法是使用Assert.Throws<T>Assert.ThrowsAny<T>方法。

但是这些方法需要一个 Action 作为参数;并且 ref 结构不能“嵌入”在 lambda 中。

那么,如何测试 ref 结构的给定方法是否正在抛出?不起作用的代码示例:

0 投票
1 回答
243 浏览

node.js - 垃圾收集时 NodeJS ref-struct 中的损坏内容

将一个ref-struct实例嵌套在另一个实例中,嵌套对象的属性之一在手动垃圾收集时被破坏。

请参阅此最小代码复制:https ://github.com/hunterlester/minimum-ref-struct-corruption

注意日志输出的第 3 行的值name没有损坏:

0 投票
3 回答
356 浏览

f# - 如何在 .NET Standard 2.0 中的 F# 中定义 ref 结构?

宣布 F# 4.5 时,声明如下:

F# 功能集包括

  • [...]

  • 生成 IsByRefLike 结构的能力(此类结构的示例:Span<'T> 和 ReadOnlySpan<'T>)。

如何“生产”这些类型?我尝试了该[<IsByRefLike>]属性,但在 .NET Standard 2.0 中未找到。

0 投票
0 回答
589 浏览

node.js - 结构指针类型的 node-ffi OUT 参数无法接收来自 DLL 调用的返回值

C 数据结构:

上面C代码的仿真JS代码:

DLL API:

上面DLL API的node-ffi代码:

节点中的 ffi 函数调用:

控制台日志将返回如下内容:

从所有 Buffer 类型日志看来,我的 OUT StructType 参数根本没有收到任何值。我不知道为什么会这样。我对使用 node-ffi 和 node-ref 很陌生。我设法与另一个 USB 设备通信,但数据结构要简单得多,没有嵌套的结构和数组类型。但是这个我不能上班。有人告诉我我做错了什么吗?

0 投票
1 回答
1005 浏览

c# - 为什么我可以在 c#7.3 中将 ref struct 声明为类的成员?

根据文档

不能将 ref 结构声明为类或普通结构的成员。

但我设法编译并运行了这个:

现在RefStruct是一个ref struct并且它是一个类的成员。这种说法在某些情况下是错误的吗?

更新 现在,文档已更新为更精确的描述。

0 投票
1 回答
398 浏览

javascript - 无法在 nodejs 12.14.0 上安装 ref-struct 模块

我正在尝试使用以下命令安装 ref-struct 模块:

环境规范:
nodejs:12.14.0
npm:6.13.4

错误我收到错误:

在此处输入图像描述


在此处输入图像描述
在上面的屏幕截图中输出为文本。

C:\Users\testuser\Desktop\testnode>npm install ref-struct

ref@1.3.5 安装 C:\Users\testuser\Desktop\testnode\node_modules\ref node-gyp rebuild

C:\Users\testuser\Desktop\testnode\node_modules\ref>如果没有定义 npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\node_modules\np m-lifecycle\node-gyp-bin\... .\node_modules\node-gyp\bin\node-gyp.js" 重建) else (节点 "C:\Program Files\nodejs\node_modules\npm\node_modules\no de-gyp\bin\node-gyp.js" 重建) 一次在此解决方案中构建项目。要启用并行构建,请添加“/m”开关。binding.cc win_delay_load_hook.cc c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(222): 错误 C2661: 'v8::Value::BooleanValue': 没有重载函数需要 0 个参数[C:\Users\testuser\Desktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(253):错误 C2660:' v8::值:: 0\include\node\v8.h(3402): 注意:见 'v8::Object::Set' c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(643) 的声明: 警告 C4996: 'Nan::ForceSet': 已宣布弃用 [C:\Users\testuser\D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\ nan\nan_maybe_43_inl.h(117): 注意: 见 'Nan::ForceSet' c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(644) 的声明: 警告 C4996: 'Nan: :ForceSet': 被声明为弃用 [C:\Users\testuser\D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117 ): 注意:见 'Nan::ForceSet' gyp ERR 的声明!构建错误 gyp ERR!堆栈错误::Object::Set' c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(643): 警告 C4996: 'Nan::ForceSet': 被声明为弃用 [C:\Users\testuser \D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:参见 'Nan::ForceSet' c 的声明:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(644): 警告 C4996: 'Nan::ForceSet': 被宣布弃用 [C:\Users\testuser\D esktop\testnode\node_modules \ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:见 'Nan::ForceSet' gyp ERR 的声明!构建错误 gyp ERR!堆栈错误::Object::Set' c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(643): 警告 C4996: 'Nan::ForceSet': 被声明为弃用 [C:\Users\testuser \D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:参见 'Nan::ForceSet' c 的声明:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(644): 警告 C4996: 'Nan::ForceSet': 被宣布弃用 [C:\Users\testuser\D esktop\testnode\node_modules \ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:见 'Nan::ForceSet' gyp ERR 的声明!构建错误 gyp ERR!堆栈错误::ForceSet': 被声明为弃用 [C:\Users\testuser\D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117 ): 注意:见 'Nan::ForceSet' 的声明 c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(644): 警告 C4996: 'Nan::ForceSet': 已被声明为弃用[C:\Users\testuser\D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:见声明'Nan::ForceSet' gyp 错误!构建错误 gyp ERR!堆栈错误::ForceSet': 被声明为弃用 [C:\Users\testuser\D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117 ): 注意:见 'Nan::ForceSet' 的声明 c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(644): 警告 C4996: 'Nan::ForceSet': 已被声明为弃用[C:\Users\testuser\D esktop\testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:见声明'Nan::ForceSet' gyp 错误!构建错误 gyp ERR!堆栈错误::ForceSet' c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(644): 警告 C4996: 'Nan::ForceSet': 被宣布弃用 [C:\Users\testuser\D esktop \testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:见 'Nan::ForceSet' gyp ERR 的声明!构建错误 gyp ERR!堆栈错误::ForceSet' c:\users\testuser\desktop\testnode\node_modules\ref\src\binding.cc(644): 警告 C4996: 'Nan::ForceSet': 被宣布弃用 [C:\Users\testuser\D esktop \testnode\node_modules\ref\build\binding.vcxproj] c:\users\testuser\desktop\testnode\node_modules\nan\nan_maybe_43_inl.h(117):注意:见 'Nan::ForceSet' gyp ERR 的声明!构建错误 gyp ERR!堆栈错误:C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe退出代码失败:1 gyp ERR!堆栈在 ChildProcess.onExit (C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:194:23) gyp ERR!ChildProcess.emit (events.js:210:5) 的堆栈 gyp ERR!堆栈在 Process.ChildProcess._handle.onexit (internal/child_process.js:272:12) gyp ERR!系统 Windows_NT 6.3.9600 gyp 错误!命令 "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" "rebui ld" gyp 错误!cwd C:\Users\testuser\Desktop\testnode\node_modules\ref gyp 错误!节点 -v v12.14.0 gyp 错误!节点-gyp -v v5.0.5 gyp 错误!不行 npm WARN test@1.0.0 没有描述 npm WARN test@1.0.0 没有存储库字段。

npm 错误!代码 ELIFECYCLE npm 错误!errno 1 npm 错误!ref@1.3.5 安装:node-gyp rebuild npm 错误!退出状态 1 npm ERR!npm 错误!ref@1.3.5 安装脚本失败。npm 错误!这可能不是 npm 的问题。上面可能有额外的日志输出。

npm 错误!可以在以下位置找到此运行的完整日志:npm ERR!C:\Users\testuser\AppData\Roaming\npm-cache_logs\2019-12-19T04_26_36_677Z-debug.log


我该如何解决这个问题?