我正在尝试为我的c ++ dll创建php 5.2.17扩展。I在Windows xp上使用Visual studio 2005和Sambar Server 7.0。我有两个问题:
-
我无法在我的代码中包含c ++内容(字符串或STL映射)......它给出的错误是:"PHP在00CF421B遇到访问冲突"。如何在 dll 中使用字符串和 STL 映射。
-
我正在尝试创建一个 c++ dll,其中包含一个具有 3 个字符串类型参数的函数,并返回这 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 服务器会自行关闭.. 没有机会看到输出。
为什么会有这种奇怪的行为,我哪里做错了?
提前致谢
阿尼尔
-
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 作为参考。
你的第一个问题是memset(a, 0, 30);
。给定的字符串(可能)只有 3 个字符长,您将 30 个字符设置为零字符,可能运行在字符串缓冲区的末尾。
然后strcpy(a,ss.c_str());
可能会导致类似的缓冲区溢出。
最后,您将返回b
中的任何内容(可能已被覆盖),而不是串联的结果。