проблемы с обёрткой c++ dll для расширения php5

Я пытаюсь создать расширение php 5.2.17 для моей библиотеки С++. Я использую Visual Studio 2005 на Windows XP с Sambar Server 7.0. У меня есть два вопроса:

  1. Я не смог включить вещи С++ (строки или карты STL) в свой код. Это дает ошибку, например: «PHP обнаружил нарушение прав доступа на 00CF421B». Как я могу использовать строки и карты STL в моей dll.

  2. Я пытаюсь создать dll С++, которая содержит функцию с 3 параметрами строкового типа и возвращает 2-ю строку из этих 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";

-> здесь 1-я строка возвращается нормально, когда для этой функции были установлены два параметра.

-> при попытке вернуть вторую строку с двумя параметрами для этой функции я получаю сообщение об ошибке: «PHP обнаружил нарушение прав доступа на 014AE07C»

-> при попытке с 3 параметрами, такими как приведенный выше код, мой сервер Sambar закрывается сам по себе ... нет шансов увидеть результат.

Почему это странное поведение, где я ошибаюсь?

Заранее спасибо

Анил


person Anil Kumar    schedule 13.04.2012    source источник
comment
Расширения PHP предназначены для написания на C, а не на C++. Если вам нужно вызвать PHP в приложении на C++, используйте встроенный SAPI, но сами расширения будут на C.   -  person Flavius    schedule 14.04.2012
comment
Я исправил ваш код, надеюсь, вы не против.   -  person Flavius    schedule 14.04.2012


Ответы (2)


  1. Расширения PHP предназначены для написания на C, а не на C++. Если вам нужно вызвать PHP в приложении на C++, используйте встроенный 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 для справки.

person Flavius    schedule 14.04.2012
comment
Привет, Флавий, я не передаю длину параметров, и это ошибка, спасибо, теперь моя dll С++ отвечает через php-код. Большое спасибо. - person Anil Kumar; 18.04.2012

Ваша первая проблема memset(a, 0, 30);. Указанная строка (вероятно) имеет длину всего 3 символа, и вы устанавливаете 30 символов на нулевой символ, возможно, перекрывая конец буфера строки.

Тогда strcpy(a,ss.c_str()); может вызвать аналогичное переполнение буфера.

Наконец, вы возвращаете то, что находится в b (которое могло быть перезаписано), а не результаты вашей конкатенации.

person Phil Cairns    schedule 13.04.2012
comment
извините, я вас запутал, я прокомментировал эти строки из своего кода. Я использовал // перед этими строками. - person Anil Kumar; 14.04.2012