【问题标题】:issues in wrapping c++ dll for php5 extension为 php5 扩展包装 c++ dll 的问题
【发布时间】:2012-04-26 06:30:19
【问题描述】:

我正在尝试为我的 c++ dll 创建 php 5.2.17 扩展。我在带有 Sambar Server 7.0 的 windows xp 上使用 Visual Studio 2005。 我有两个问题:

  1. 我无法在我的代码中包含 c++ 内容(字符串或 STL 映射)。它给出的错误如下:“PHP 在 00CF421B 遇到访问冲突”。如何在我的 dll 中使用字符串和 STL 映射。

  2. 我正在尝试创建一个 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 中。
  • 我已经更正了你的代码,希望你不要介意。

标签: php visual-c++ php-internals


【解决方案1】:

您的第一个问题是memset(a, 0, 30);。给定的字符串(可能)只有 3 个字符长,而您将 30 个字符设置为零字符,可能超出了字符串缓冲区的末尾。

那么strcpy(a,ss.c_str());很可能会导致类似的缓冲区溢出。

最后,您将返回 b 中的任何内容(可能已被覆盖),而不是您的串联结果。

【讨论】:

  • 对不起,我把你弄糊涂了,我已经从我的代码中注释了这些行。我在这些行之前使用了 //。
【解决方案2】:
  1. PHP 扩展是用 C 而不是 C++ 编写的。如果您需要在 C++ 应用程序中调用 PHP,请使用嵌入 SAPI,但扩展本身将在 C 中。

  2. 无论如何,对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 作为参考。

【讨论】:

  • 嗨弗拉维乌斯,我没有传递参数长度,这就是错误,谢谢,现在我的 c++ dll 正在通过 php 代码响应。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2012-07-16
相关资源
最近更新 更多