问题标签 [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 投票
0 回答
545 浏览

javascript - node-ffi-napi 在方法调用上没有收到来自 dll 的任何响应,可能是结构问题?

所以 C++ 不是我的强项,所以很可能我在创建结构类型时犯了一个错误,我不太明白如何创建 C++ 代码在 js 端所期望的等效返回类型。

这是来自 C++ 的一个工作示例:

这是 IO_SpecificData 类型:

和 IO_SArgBlockParam 类型:

我没有编写 C++,所以我不确定它为什么会这样。

这是我在 js 方面所做的,(我尝试过的众多版本之一)。我创建了上面定义的结构类型的两个等价物,如下所示:

您可能会注意到我缺少 IO_SArgBlockParam 中的 *pu8ArgBlock。那是因为我现在正尝试在方法调用中逐步构建结构,如下所示。

首先这里是我设置 dll 和方法的地方:

这是方法调用本身:

它运行时我没有收到任何错误,它似乎永远不会退出方法调用。我尝试了几种不同的选择,我认为我所做的没有任何明显的错误。connect 函数可以工作,但只要有任何东西需要 IO_SArgBlockParam 返回类型,它就不起作用。我显然犯了一个错误。如果有人知道如何解决这个问题,我将不胜感激。

编辑:忘了提,这是在电子子进程上运行的。当它在主进程上运行时,它会杀死 Electron 并返回此“进程以退出代码 -1073741819 (0xC0000005) 完成”。

0 投票
1 回答
172 浏览

c# - System.Reflection.Emit:ref struct 的字段或属性

对于以下接口和结构:

我想通过反射得到以下 lambda 表达式:

不幸的是,这不能编译:cs8153: an expression tree lambda may not contain a call to a method, property, or indexer that returns by reference. 似乎ref struct不支持通过反射获取任何成员。

所以我必须去System.Reflection.Emit生成以下访问器类:

并通过反射获得以下 lambda 表达式:

这是我使用以下代码生成Accessor类的代码System.Reflection.Emit

消费生成的AccessorInvalidProgramException: Common Language Runtime detected an invalid program.时,调用生成的getter时得到;并System.MethodAccessException: Attempt by method 'Accessor.SetField0(IRecord`1<Entity>, Int32)' to access IRecord`1<Entity>.get_FieldValues()' failed.在调用生成的 setter 时获取。

我究竟做错了什么?我为此花了一整天,非常沮丧。任何帮助将不胜感激!

0 投票
1 回答
26 浏览

c - GLib 中的 GRefString 实现是什么?

我想知道引用计数存储在哪里?由于类型定义为:

并且所有g_ref_string*…()函数都简单地返回gchar *,而不是一个可以保存引用计数的结构。在指向内存sds之前保存元数据头结构是库的技巧吗?char *恐怕这种实施在某些时候会适得其反,对吗?即:使用这种带有前置头的字符串时会出现什么问题?

0 投票
0 回答
83 浏览

c# - 如何对跨度进行排序在基于另一个 Span 的值的 ref 结构内在同一个 ref 结构中?

我有以下参考结构:

我想indexes通过wordCount比较wordCount[indexes[i]]来排序wordCount[indexes[j]]

第一个想法是使用Sort<T>(Span<T>, Comparison<T>)

但是这样的事情是行不通的

错误是:不能在匿名方法、lambda 表达式或查询表达式中使用 ref local 'wordCollection'

还有,public static void Sort<TKey,TValue,TComparer> (this Span<TKey> keys, Span<TValue> items, TComparer comparer) where TComparer : System.Collections.Generic.IComparer<TKey>;但我也不能使用它,因为 ref structs 不能实现接口。

那么,有没有一种方法可以使用框架提供indexeswordCounts[indexes[i]]Sort 方法进行排序,而无需编写自己的排序代码?

0 投票
1 回答
71 浏览

c# - 为什么不能将`stackalloc`表达式分配给`Span`参数?

考虑以下方法(小提琴):

我不明白为什么param = stackalloc int[10];会产生错误:

stackalloc不能在此上下文中使用类型为“Span”的表达式的结果,因为它可能会暴露在包含方法之外

Span是一个ref struct但是(尽管它的名字)它仍然是一个值类型,所以任何修改param都不会反映在调用者对象上。

我认为是param一个具有初始值的局部变量,我不明白为什么test2编译而test没有。

stackalloc int[10]in的返回值如何test逃出方法的作用域?

0 投票
0 回答
24 浏览

node.js - 无法使用 ffi 和 ref-struct 将 lfFaceName 转换为 char 类型

我正在尝试迭代我的机器(Windows)中存在的字体并实现我正在通过 ffi 在 javascript 文件中从gdi32.dll访问EnumFontFamiliesExA方法,如下所示:

索引.js

LogFontA.js - 通过ref-struct包创建的结构并将lfFaceName定义为“ ref.types.char ”(参考自:https ://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns- wingdi-logfonta?redirectedfrom=MSDN )

当我运行 index.js 代码并尝试打印lfFaceName时,它​​会将其打印为83。我尝试将其类型转换为 ArrayType(ref.types.char),但无法使其正常工作。

如何获取 lfFaceName 作为字符串?