D 将ClutterActor*播放到ClutterStage*

D 将ClutterActor*播放到ClutterStage*,d,gobject,clutter,D,Gobject,Clutter,我正在探索为D创建混乱绑定的可能性 语言()和 尝试使用libcroot的动态加载进行一些简单的测试。我跑了 一个可能源于GObject继承的问题 系统,如果有人能帮我解决这个问题,我将不胜感激。这是我的建议 rundown:使用clutter\u stage\u get\u default返回一个ClutterActor*,其中 我可以使用crawt\u actor\ux方法。但我总是会犯错误或者 当我使用杂波阶段或杂波容器时出现SEGFULTS_* 方法。以下是我的测试代码: 在第56行的混

我正在探索为D创建混乱绑定的可能性 语言()和 尝试使用libcroot的动态加载进行一些简单的测试。我跑了 一个可能源于GObject继承的问题 系统,如果有人能帮我解决这个问题,我将不胜感激。这是我的建议 rundown:使用clutter\u stage\u get\u default返回一个ClutterActor*,其中 我可以使用crawt\u actor\ux方法。但我总是会犯错误或者 当我使用杂波阶段或杂波容器时出现SEGFULTS_* 方法。以下是我的测试代码:

在第56行的混乱容器添加参与者调用中,我得到以下错误:
(:11976):杂乱关键**:杂乱容器添加参与者:
断言“杂乱是容器(容器)”失败

在示例代码中,我注意到了STAGE和 用于强制转换的容器宏(这些宏显然不是 但据我所知,他们只是在表演 进行了一些检查,然后进行了普通的C转换。如果这是不正确的,还有一些 Gobject类型的魔术需要在舞台指针上完成 铸造,请让我知道。绑定和使用 杂波阶段设置标题或杂波阶段设置颜色与
cast(杂波阶段*)阶段
分段错误,大概是同一个问题

编辑:这里有一个没有外部依赖项的例子(如果你不在Linux上,你需要用操作系统的等价物替换dl调用)。根据GDB和Valgrind的说法,这段代码由于segfault而失败,segfault位于
traffle\u stage\u set\u title(在/usr/lib/libtraffle-glx-1.0.so.0.600.14中)

D中的结构不能相互继承,强制转换结构指针将返回null,除非有到
void*
的中间转换(与C转换不同)我在这里遭到驳斥

最好使用句柄包装结构添加另一个抽象层,并在强制转换时模拟来自这些宏的检查

但是如果你这样做会发生什么呢

clutter_container_add_actor(cast(ClutterContainer*)(cast(void*)stage), textbox);

(先强制转换为void*然后再转换为ClutterContainer*)

问题是您没有将C函数声明为
extern(C)
。因为dmd认为您调用的是D函数,并且使用了错误的调用约定。正确执行此操作的一种方法如下:

alias extern(C) void function(void*, const char*) setTitleFunc;
auto clutter_stage_set_title = getSym!(setTitleFunc)("clutter_stage_set_title");
但是我不知道如果没有别名该如何工作。DMD拒绝解析模板参数中带有
extern(C)
的任何内容:

auto clutter_stage_set_title = getSym!(extern(C) void function(void*, const char*))("clutter_stage_set_title"); //Doesn't work
顺便说一句:您的
cstring
函数很危险:它返回一个char*,表示可以修改字符串,但这并不总是正确的:如果您将字符串文本传递给
toStringz
它可能不会分配新内存,而是返回原始字符串的指针。字符串文本位于只读内存中,因此这可能会导致问题


您可以调整您的函数类型以匹配C类型(
const gchar*
在C-->
const char*
在D中)并直接使用ToString gz。

使用您的建议会产生相同的结果。此外,强制转换结构指针不会产生null——添加
writeln(stage);writeln(cast(ClutterContainer*)阶段生成两个相同的内存地址。我使用的是DMD2.053,如果这有什么区别的话。@justin你可能只需要使用空指针作为杂波句柄,这就是我在其他库中看到的与C风格接口的做法structs@justin或者尝试获取结构的确切结构,并将其重新创建到D接口文件中,然后尝试使用这些方法。因为我只是简单地将指针从一个杂波函数传递到下一个杂波函数,所以我不需要了解结构的任何内容。另外,编辑了一个问题,链接到simplified,nothing,void*的示例。@justin作为旁白,您正在导入的函数是用C调用约定实现的吗?啊,我没有意识到在动态绑定时需要指定C调用约定,尽管回想起来是有意义的。