1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Работа С C++ Библиотекой Из Php Расширения

Тема в разделе "С и С++", создана пользователем evilive, 29 авг 2012.

  1. evilive

    evilive Гость

    Репутация:
    0
    Доброго всем времени суток!

    Проблема в следующем: есть простейшее PHP расширение, написанное на С++, в которой происходит вызов функции из внешней библиотеки , также написанной на С++. При вызове функции в PHP, выводится ошибка: "Fatal error: Call to undefined function mul() in C:\Apache2.2\htdocs\phpinfo.php on line 3".

    Общая схема такая:
    PHP: echo mul(5, 4); -> PHP Extension: PHP_FUNCTION(mul) -> DLL: Math::Mul()

    Вот вызов функции в PHP:

    PHP:
    <?php 
    echo mul(54);
    ?>
    Здесь экстеншен:

    Код:
    #include "stdafx.h"
    using namespace MathFuncs;
    
    PHP_FUNCTION(sum);
    PHP_FUNCTION(mul);
    
    const zend_function_entry test_functions[] = {
    PHP_FE(sum, NULL)
    PHP_FE(mul, NULL)
    {NULL, NULL, NULL}
    };
    
    zend_module_entry test_module_entry = {
    STANDARD_MODULE_HEADER,	  // #if ZEND_MODULE_API_NO >= 20010901
    "test_ext",				  // название модуля
    test_functions,			  // указываем экспортируемые функции
    NULL,						 // PHP_MINIT(test), Module Initialization
    NULL,						 // PHP_MSHUTDOWN(test), Module Shutdown
    NULL,						 // PHP_RINIT(test), Request Initialization
    NULL,						 // PHP_RSHUTDOWN(test), Request Shutdown
    NULL,						 // PHP_MINFO(test), Module Info (для phpinfo())
    "0.1",						// версия нашего модуля
    STANDARD_MODULE_PROPERTIES
    };
    
    ZEND_GET_MODULE(test)
    
    PHP_FUNCTION(sum)
    {
    int a, b;
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b))
    return;
    
    RETURN_LONG(a+b);
    }
    
    PHP_FUNCTION(mul)
    {
    double a, b;
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dd", &a, &b))
    return;
    
    RETURN_DOUBLE(Math::Mul(5, 6));
    }
    И библиотека, заголовок:

    Код:
    namespace MathFuncs
    {
    class Math
    {
    public:
    static __declspec(dllexport) double Mul(double a, double b);
    
    static __declspec(dllexport) double Div(double a, double b);
    };
    }
    и тело:
    Код:
    #include "test.h"
    #include <stdexcept>
    
    using namespace std;
    
    namespace MathFuncs
    {
    
    double Math::Mul(double a, double b)
    {
    return a * b;
    }
    
    double Math::Div(double a, double b)
    {
    if(b == 0)
    {
    throw new invalid_argument("b cannot be zero!");
    }
    return a / b;
    }
    }
    В чем может быть дело?
     
Загрузка...

Поделиться этой страницей