作者buganini (霸格尼尼)
看板PHP
標題[已解決] PHP extension RETURN_RESOURCE zend_parse_parameters("r")
時間Sat May 23 17:15:16 2009
我現在有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)