SilverS 发表于 2021-3-10 15:54:56

C语言函数无法调用火山取得的静态函数地址

本帖最后由 SilverS 于 2021-3-10 16:16 编辑

在封装Cairo图形库时遇到一个函数 需要为其提供一个回调函数地址,就是下面函数中的第四个参数

这是是那个函数的声明:
cairo_set_user_data (cairo_t *cr ,
                              const cairo_user_data_key_t *key ,
                              void *user_data,
                              cairo_destroy_func_t destroy);

这是上面第四个参数的指针定义:
void(*cairo_destroy_func_t) (void *data);




我使用火山的 取静态函数地址()取得了一个静态方法地址 然后后传递进去却无法触发此回调,这是怎么回事啊?我在VS里测试时都没问题的。

飞扬工作室 发表于 2021-3-11 22:35:20

火山的静态函数都默认具有CALLBACK前缀的,像你上面的,使用的是默认_CDCEL调用模式,在对应火山静态方法上使用属性值为"@_CDCEL"的"@视窗.前缀文本"属性加上该前缀就行了.

SilverS 发表于 2021-3-12 14:36:22

飞扬工作室 发表于 2021-3-11 22:35
火山的静态函数都默认具有CALLBACK前缀的,像你上面的,使用的是默认_CDCEL调用模式,在对应火山静态方法上使 ...

谢谢!已经解决了

SilverS 发表于 2021-3-12 16:17:07

本帖最后由 SilverS 于 2021-3-12 16:21 编辑

飞扬工作室 发表于 2021-3-11 22:35
火山的静态函数都默认具有CALLBACK前缀的,像你上面的,使用的是默认_CDCEL调用模式,在对应火山静态方法上使 ...
吴总,请问这样的回调是否应该弄成火山里的事件方法呢?,我试过可是不知道怎样获取非静态成员方法地址 所以实现不了,不知有其它办法可以将这样的回调实现为火山的事件的吗?

飞扬工作室 发表于 2021-3-12 20:02:49

直接在回调函数里面调用火山的事件方法就行了啊

SilverS 发表于 2021-3-14 02:45:56

本帖最后由 SilverS 于 2021-3-14 02:57 编辑

飞扬工作室 发表于 2021-3-12 20:02
直接在回调函数里面调用火山的事件方法就行了啊
可是回调是静态方法,里面无法调用当前实例的事件方法呀。


飞扬工作室 发表于 2021-3-14 09:05:01

把对象指针作为用户**传递过去

SilverS 发表于 2021-3-14 11:40:41

本帖最后由 SilverS 于 2021-3-14 11:44 编辑

飞扬工作室 发表于 2021-3-14 09:05
把对象指针作为用户**传递过去
很多办法都试过了,回调的参数只能这样 改不了,改了后就接收不到数”据了, 因为这个是回调是由封装库内部调用的。
页: [1]
查看完整版本: C语言函数无法调用火山取得的静态函数地址