smalltalk - 如何在 Squeak FFI 中引用外部全局变量

标签 smalltalk ffi squeak

为了连接 HDF5,我需要获取库导出的外部变量的引用/值,并将其传递给其他外部函数。

例如,有一个代表 native double 类型的变量:H5T_NATIVE_DOUBLE_g

在 VW、DLLCC 中,这可以通过声明性注释来实现:

H5T_NATIVE_DOUBLE_g
    <C: hid_t H5T_NATIVE_DOUBLE_g>

Squeak FFI 有类似的东西吗?对于这样的用例有任何支持吗?

最佳答案

经过询问,(Threaded)FFIPlugin中似乎至少有基本的支持:

ExternalAddress class>>loadSymbol: moduleSymbol module: module 
    <primitive: 'primitiveLoadSymbolFromModule' module: 'SqueakFFIPrims'>
    ^ self primitiveFailed

因此,我们可以创建一个ExternalData,通过上面的消息获取其地址(传递全局变量名称和给定的ExternalLibrary作为模块参数),并指定其类型。
如果外部函数需要一个指针,我们就可以使用这个ExternalData来传递地址。
要传递该值,需要取消引用该地址,不确定它是否是由插件自动执行的...

就我而言,我知道我必须传递该值,因此我可以直接取消引用该地址以获取该值并存储该值(假设全局变量在初始化时分配一次并且之后不会更改并假设初始化已经在库加载时发生 - 许多应用程序特定的假设...)。

关于smalltalk - 如何在 Squeak FFI 中引用外部全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62427197/

相关文章:

c++ - 如何通过 Rust FFI 调用 C++ 构造函数?

rust - 如何在 Rust 中存储对结构的 void* 引用?

linux - GHC:奇怪条件下的段错误

reflection - 在 Squeak 中,我在哪里可以找到消息处理算法的代码?

smalltalk - 吱吱声中的新线

linux - 甚至无法在 CentOS 6.5 上安装 Pharo 3

smalltalk - Pharo 4 FFI 异步回调

smalltalk - 在Squeak中,如何包装每个方法send?

ide - squeak/pharo 的替代 IDE

ruby - 什么是基于文件的源代码?