[问题]PHP扩展库开发,如何得到C/C++中复杂数据结构的值,或者指针所指的值

Brightzliu 2014-09-30 10:07:34
想封装一下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++中复杂对象的值,或者指针所指的值。
...全文
218 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧