递归火山软件开发平台

标题: [新手]请教关于嵌入式函数指针回调问题 [打印本页]

作者: nybc114    时间: 3 天前
标题: [新手]请教关于嵌入式函数指针回调问题
本帖最后由 nybc114 于 2025-9-23 11:50 编辑

比如像这种函数指针 void* (*Func)(int,int);
Func p1;
如果我想要用火山的变量接收这个P1那要用什么类型呢 @<p>=p1; 也就是说我在火山要把这个p变量定义成什么类型才能接收这个嵌入式中的p1

还有像 void* 这样的值是不是也是同理

作者: wangvoldp    时间: 3 天前
取静态方法地址 直接传变整数也行
作者: nybc114    时间: 3 天前
wangvoldp 发表于 2025-9-23 12:28
取静态方法地址 直接传变整数也行

传变整数报错 0000005
取那个什么地址最终还是要一个变量接收
主要是嵌入后能正常接收
作者: nybc114    时间: 3 天前
wangvoldp 发表于 2025-9-23 12:28
取静态方法地址 直接传变整数也行

还有嵌入语句不能用火山的方法
作者: wangvoldp    时间: 3 天前
对回调指针也不很熟, 我是方法接收变整数, 然后在嵌入里用强制类型转换为原来的

  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 方法 注册函数 <公开 注释 = "注册全局函数" @禁止流程检查 = 真>
  3. 参数 FuncName <类型 = 文本型>
  4. 参数 Func <类型 = 变整数>
  5. {
  6.     变量 Text <类型 = 字节集类 @输出名 = "Text">
  7.     Text = 文本到多字节 (FuncName)
  8.     @ lua_register((lua_State *)@<L>, (char*)Text.GetPtr(), (lua_CFunction)@<Func>);
  9. }

复制代码

作者: wangvoldp    时间: 3 天前
本帖最后由 wangvoldp 于 2025-9-23 12:41 编辑

我也不很熟我是这样用的, 变整数接收, 嵌入调用再转换为方法lua_CFunction是定义的回调方法, 只需给变整数转换成这个就行了typedef int (*lua_CFunction)(lua_State *L);

  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 方法 注册函数 <公开 注释 = "注册全局函数" @禁止流程检查 = 真>
  3. 参数 FuncName <类型 = 文本型>
  4. 参数 Func <类型 = 变整数>
  5. {
  6.     变量 Text <类型 = 字节集类 @输出名 = "Text">
  7.     Text = 文本到多字节 (FuncName)
  8.     @ lua_register((lua_State *)@<L>, (char*)Text.GetPtr(), (lua_CFunction)@<Func>);
  9. }

复制代码


作者: nybc114    时间: 3 天前
wangvoldp 发表于 2025-9-23 12:40
我也不很熟我是这样用的, 变整数接收, 嵌入调用再转换为方法lua_CFunction是定义的回调方法, 只需给变整数 ...

你这方案我不会用  也可能是跟我这个需求不一样 我翻了翻官方的基础类封装  发现可以用通用指针接收   但目前不知道怎么用这个通用指针调用方法
作者: Xelloss0618    时间: 3 天前
用变整数就行了啊,类型强转一下 @<p> = (INT_P)p1;
火山可以用“调用静态方法”调用这个函数指针,注意这个命令只支持 stdcall 的调用约定,你要 cdecl 就自己改一个好了,把代码里的 CALLBACK 改成 __cdecl

作者: nybc114    时间: 3 天前
Xelloss0618 发表于 2025-9-23 14:57
用变整数就行了啊,类型强转一下 @ = (INT_P)p1;
火山可以用“调用静态方法”调用这个函数指针,注意这个命 ...

好的  谢谢  我研究研究




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4