如何通过Ruby的FFI扩展使用本机c代码的动态缓冲区指针

时间:2012-03-09 14:41:57

标签: ruby ffi

在c-code方面,它是:

/* Declarations */
DATABLOCK *new_db ();
edit_db(DATABLOCK **db);

/* Usage */
db = new_db();
edit_db(&db);

Ruby如何发展? https://github.com/ffi/ffi/wiki/Examples提到了MemoryPointer但是在我的情况下我已经拥有该缓冲区(由new_db()创建),那么如何将参考传递给缓冲区以获取edit_db()或它应该如何进行?有点丢失......

1 个答案:

答案 0 :(得分:3)

edit_db()将指针指针作为参数。

所以,你需要这样的东西:

db = LibDB.new_db()

# pack the 'db' pointer into a temporary bit of memory
dbp = FFI::MemoryPointer.new(:pointer)
dbp.write_pointer(db)

# equivalent of edit_db(&db);
LibDB.edit_db(dbp)

# read the 'db' pointer back out in case edit_db altered the actual pointer value
db = dbp.read_pointer