2012-03-09 54 views
2

使用本地C代碼的動態緩衝區指針在C代碼側有云:如何通過Ruby的FFI擴展

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

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

如何這樣下去紅寶石? https://github.com/ffi/ffi/wiki/Examples提到MemoryPointer,但在我的情況下,我已經有緩衝區(由new_db()創建),所以如何將引用傳遞給edit_db()的緩衝區或它應該如何去?位丟在這裏..

回答

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 
+0

偉大的答案,謝謝! – MJo 2012-03-12 20:44:41