包装c ++ dll for php5扩展的问题

时间:2012-04-13 21:23:41

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

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

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

  2. 我正在尝试创建一个包含3个字符串类型参数的函数的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服务器自行关闭..没有机会看到输出。

    为什么这种奇怪的行为,我哪里出错?

    先谢谢

    阿尼尔

2 个答案:

答案 0 :(得分:1)

  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变量是整数。

  3. 使用lxr.php.net作为参考。

答案 1 :(得分:0)

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

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

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