- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序,该程序将运行动态库中的函数,其名称、参数及其类型由用户输入。我可以使用 dlsym(func_name)
得到一个指向这个函数的 void* 指针,但是我事先不知道参数的类型和它们的数量,所以我不能以正常的方式取消引用这个指针。
如果我将所有参数的字节表示复制到一个 char *
数组中,我可以调用一个函数并以此数组作为参数吗?例如,当在程序集中调用 printf 时,我可以将参数和格式字符串压入堆栈并调用 printf。也许我可以在 C 中做类似的事情,或者使用程序集插入?
例如,假设函数是 void func(int, double);
我得到参数 int a
和 double b
.然后我会创建一个数组:
char buf[sizeof(int) + sizeof(double)]
memcpy(buf, &a, sizeof(int))
memcpy(buf + sizeof(int), &b, sizeof(double))
并将其用作压入堆栈的参数。
用户输入函数的名称、描述其类型的字符串以及参数本身。例如:
func_name
viid
5
6
2.34
func_name 是将在 dlsym 中使用的函数的名称。 viid 表示该函数具有 void func_name(int, int, double)
类型(第一个 char 是返回类型,其余是参数。v = void, i = int, d = double)。其余为参数。
最佳答案
不,除了可能在纯粹在堆栈上传递参数的 ABI 中。任何计算环境都有如何传递参数的规范。 (此规范是平台的应用程序二进制接口(interface) [ABI] 规范的一部分。)参数类型和大小会影响它们是在通用寄存器、浮点寄存器还是其他位置传递,以及它们如何对齐。很少(如果有的话)这样的规范将参数作为字节的原始转储传递到堆栈。
可以编写代码来解码参数的描述并构造调用函数所需的状态。这样的代码至少需要部分用汇编或各种语言扩展来编写。 (我希望有些人可能已经编写了这样的代码并使其可用,但没有这样的引用。)对于大多数情况来说,这可能是一个实现起来成本过高的解决方案;您应该寻求替代方法来实现您的基本目标。
如果 ABI 确实指定所有参数都放在堆栈上,则可以在包含 unsigned char
数组的结构中传递任意参数:
struct { unsigned char bytes[128]; }
,因为标准 C 不支持可变大小的结构。请注意,ABI 可能包含影响函数调用的其他细节,例如规定某个寄存器必须包含参数的数量或以某种方式设置,即使它本身不包含参数也是如此。
关于我可以将 char* 数组而不是几个参数传递给函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61375829/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!