[问题]PHP扩展库开发,如何得到C/C++中复杂数据结构的值,或者指针所指的值
想封装一下C或者C++的接口,在PHP中获得结构体或者对象的元素的值,从网上搜了下方法,大致步骤如下,但最后我的结果是core dump了。 哪位高手帮忙看一下吧:
1. ./ext_skel --extname=test
2. ./configure --enable-test
3. 在 php_test.h, 添加代码:
typedef struct mydata {
int m_id;
int m_age;
}MYDATA;
PHP_FUNCTION(wrap_getMydata);
4.在文件 test.c, 增加:
#define MY_RES_NAME "my_resource";
static int my_resource_descriptor;
PHP_FE(wrap_getMydata, NULL)
...
ZEND_MINIT_FUNCTION(test)
{
/* If you have INI entries, uncomment these lines
REGISTER_INI_ENTRIES();
*/
resid = zend_register_list_destructors_ex(NULL, NULL, MY_RES_NAME, module_number);
return SUCCESS;
}
PHP_FUNCTION(test_getMydata)
{
zval* res;
long int a, b;
long int result;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
return;
}
MYDATA objData;
objData.m_id = a;
objData.m_age = b;
ZEND_REGISTER_RESOURCE(res, &objData, resid);
RETURN_RESOURCE(res);
}`
4. 在test.php中增加测试代码: var_dump(test_getMydata(3,4))
5. 执行: make; make isntall; ../../bin/php test.php ,然后输出:
Functions available in the test extension: confirm_wrap_compiled test_getMydata Congratulations! You have successfully modified ext/wrap/config.m4. Module wrap is now compiled into PHP. Segmentation fault (core dumped)
使用GDB看了下: $gdb ../../bin/php core.23310
`Loaded symbols for /home/user1/php/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/test.so
0 0x00000000006388ad in execute (op_array=0x2a9569bd68) at /home/user1/php/php-5.2.17/Zend/zend_vm_execute.h:92
92 if (EX(opline)->handler(&execute_data TSRMLS_CC) > 0) {`
这个问题是啥呢?
其实总体问题就是:如何在PHP中获得C/C++中复杂对象的值,或者指针所指的值。