我正在尝试为我的c ++ dll创建php 5.2.17扩展。我在Windows XP上使用Visual Studio 2005和Sambar Server 7.0。 我有两个问题:
我无法在我的代码中包含c ++东西(字符串或STL映射)..它给出的错误如:“PHP在00CF421B遇到了访问冲突”。如何在我的dll中使用字符串和STL地图。
我正在尝试创建一个包含3个字符串类型参数的函数的c ++ dll,并返回其中第3个字符串。
以下是代码:
PHP_FUNCTION(add){
char* a;
char* b;
char* c;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &a,&b,&c) == FAILURE) {
RETURN_STRING("Bad parameters!", true);
}
//string ss=a;
//ss=ss+b;
//memset(a,0,30);
//strcpy(a,ss.c_str());
//php_printf("a : %s b : %s ",a,b);
RETURN_STRING(b,1);
}
php文件包含:
$a="abc";
$b="def";
$c="ghi";
$result = add($a,$b,$c);
print "Calling add($a,$b,$c) returned $result";
- >当为此函数设置了两个参数时,第一个字符串返回正常。
- >当试图为这个函数返回带有两个参数的第二个字符串时,我收到一个错误:“PHP在014AE07C遇到了访问冲突”
- >当尝试使用上述代码之类的3个参数时,我的sambar服务器自行关闭..没有机会看到输出。
为什么这种奇怪的行为,我哪里出错?
先谢谢
阿尼尔
答案 0 :(得分:1)
PHP扩展意味着用C语言编写,而不是用C ++编写。如果需要在C ++应用程序中调用PHP,请使用嵌入式SAPI,但扩展本身将在C中。
无论如何,对zend_parse_parameters()
的调用应如下所示:
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &a, &a_len,&b, &b_len,&c, &c_len) == FAILURE)
其中_len
变量是整数。
使用lxr.php.net作为参考。
答案 1 :(得分:0)
您的第一个问题是memset(a, 0, 30);
。给出的字符串(可能)只有3个字符长,并且您将30个字符设置为零字符,可能在字符串缓冲区的末尾运行。
然后strcpy(a,ss.c_str());
可能会导致类似的缓冲区溢出。
最后,你将返回b
中的任何内容(可能已被覆盖),而不是连接的结果。