问题标签 [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.
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) 完成”。
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
:
消费生成的Accessor
类InvalidProgramException: 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 时获取。
我究竟做错了什么?我为此花了一整天,非常沮丧。任何帮助将不胜感激!
c - GLib 中的 GRefString 实现是什么?
我想知道引用计数存储在哪里?由于类型定义为:
并且所有g_ref_string*…()
函数都简单地返回gchar *
,而不是一个可以保存引用计数的结构。在指向内存sds
之前保存元数据头结构是库的技巧吗?char *
恐怕这种实施在某些时候会适得其反,对吗?即:使用这种带有前置头的字符串时会出现什么问题?
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 不能实现接口。
那么,有没有一种方法可以使用框架提供indexes
的wordCounts[indexes[i]]
Sort 方法进行排序,而无需编写自己的排序代码?
c# - 为什么不能将`stackalloc`表达式分配给`Span`参数?
考虑以下方法(小提琴):
我不明白为什么param = stackalloc int[10];
会产生错误:
stackalloc
不能在此上下文中使用类型为“Span”的表达式的结果,因为它可能会暴露在包含方法之外
Span
是一个ref struct
但是(尽管它的名字)它仍然是一个值类型,所以任何修改param
都不会反映在调用者对象上。
我认为是param
一个具有初始值的局部变量,我不明白为什么test2
编译而test
没有。
stackalloc int[10]
in的返回值如何test
逃出方法的作用域?
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 作为字符串?