看板 PHP 關於我們 聯絡資訊
我現在有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)
weiyucsie :雖然沒寫過 不過你的myrun為什麼是rs? 05/23 18:03
weiyucsie :看php只有一個參數阿? 05/23 18:04
buganini :漏寫了orz 05/23 18:06
※ 編輯: buganini 來自: 220.135.231.23 (05/23 18:06)
weiyucsie :另外 我看網路上的資料 好像建議用emalloc? 05/23 18:10
weiyucsie :就是php自己的記憶體管理 05/23 18:10
weiyucsie :不過我只是稍微找一下 你可能要自己確認就是了@@ 05/23 18:11
buganini :不過malloc那句是在外部的c lib裡面的code 有需要嗎? 05/23 18:15
※ 編輯: 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)