[解決]PHP extension RETURN_RESOURCE zend_parse_parameters("r")

看板PHP作者 (霸格尼尼)時間16年前 (2009/05/23 17:15), 編輯推噓0(007)
留言7則, 2人參與, 最新討論串1/1
我現在有C lib: struct mytype *mycreate(char *blah){ struct mytype *la; la=malloc(123); printf("Create %p\n", la); return la; } void myinit(struct mytype *p){ printf("Init %p\n", p); } -- PHP wrapper: PHP_FUNCTION(mycreate){ char *c, *p; int l; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &c, &l) == FAILURE){ return; } RETURN_RESOURCE((long int)mycreate(c)); } PHP_FUNCTION(myrun){ struct mytype *p; char *c; int l; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &p, &c, &l) == FAILURE){ RETURN_BOOL(0); } myinit(p); ... } -- PHP code: <?php $h=mycreate("lalala"); echo $h; echo myrun($h,"abc"); ?> -- Output: Create 0x486dda00 Resource id #1215158784 Init 0x4862aa28 Segmentation fault -- 問題: c lib裡面mycreate傳回的是0x486dda00 php這邊看到的resource id #1215158784正好是decimal的0x486dda00 目前應該沒錯 接下來傳進myrun的時候, myrun再把這個指標送給myinit 這是後myinit看的的卻不是原本的位址了! 請問是我型態沒弄對嗎? resource不能直接轉pointer? -- 順便問一下 用ext_skel生出來的php wrapper skeleton 會讓我的code受到GPL感染嗎? 這個自問自答... PHP不是GPL.. -- 謝謝 -- 國愛‧主民‧學科‧康健‧道人 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.231.23 ※ 編輯: buganini 來自: 220.135.231.23 (05/23 17:18)

05/23 18:03, , 1F
雖然沒寫過 不過你的myrun為什麼是rs?
05/23 18:03, 1F

05/23 18:04, , 2F
看php只有一個參數阿?
05/23 18:04, 2F

05/23 18:06, , 3F
漏寫了orz
05/23 18:06, 3F
※ 編輯: buganini 來自: 220.135.231.23 (05/23 18:06)

05/23 18:10, , 4F
另外 我看網路上的資料 好像建議用emalloc?
05/23 18:10, 4F

05/23 18:10, , 5F
就是php自己的記憶體管理
05/23 18:10, 5F

05/23 18:11, , 6F
不過我只是稍微找一下 你可能要自己確認就是了@@
05/23 18:11, 6F

05/23 18:15, , 7F
不過malloc那句是在外部的c lib裡面的code 有需要嗎?
05/23 18:15, 7F
※ 編輯: buganini 來自: 220.135.231.23 (05/23 19:10) http://0rz.tw/jrzYJ 解的時候要用zend_rsrc_list_entry去收 然後用->ptr ※ 編輯: buganini 來自: 220.135.231.23 (05/23 19:37)
文章代碼(AID): #1A5xwcob (PHP)
文章代碼(AID): #1A5xwcob (PHP)