Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6310
Последний выпуск: 19.06.2015

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

84K
29 августа 2012 года
Paradiz
6 / / 29.08.2012
Доброго всем времени суток!

Проблема в следующем: есть простейшее 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
    echo mul(5, 4);
?>
Здесь экстеншен:

Код:
#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;
    }
}
В чем может быть дело?
1
29 августа 2012 года
kot_
7.3K / / 20.01.2000
В какой версии студии собиралась длл? Соотвествует ли версия msvc?
1
29 августа 2012 года
kot_
7.3K / / 20.01.2000
и кстати, само расширение вообще загружается?
84K
29 августа 2012 года
Paradiz
6 / / 29.08.2012
Цитата: kot_
В какой версии студии собиралась длл? Соотвествует ли версия msvc?


vc 9
да все либы и непосредственно php собирались в vc 9

84K
29 августа 2012 года
Paradiz
6 / / 29.08.2012
Цитата: kot_
и кстати, само расширение вообще загружается?


загружается, причем если закомментить функцию PHP_FUNCTION(mul), то все нормально работает

1
29 августа 2012 года
kot_
7.3K / / 20.01.2000
Цитата: Paradiz
Цитата: kot_
и кстати, само расширение вообще загружается?


загружается, причем если закомментить функцию PHP_FUNCTION(mul), то все нормально работает


Т.е. когда ты запускаешь php.exe в консоли - никаких ошибок нет?

1
29 августа 2012 года
kot_
7.3K / / 20.01.2000
и еще. у тебя функция должна принимать параметры. Но вызова ZEND_BEGIN_ARG_INFO_EX у тебя нигде в коде нет
84K
29 августа 2012 года
Paradiz
6 / / 29.08.2012
Цитата: kot_
Цитата: Paradiz
Цитата: kot_
и кстати, само расширение вообще загружается?


загружается, причем если закомментить функцию PHP_FUNCTION(mul), то все нормально работает


Т.е. когда ты запускаешь php.exe в консоли - никаких ошибок нет?



ошибок нет

84K
29 августа 2012 года
Paradiz
6 / / 29.08.2012
Цитата: kot_
и еще. у тебя функция должна принимать параметры. Но вызова ZEND_BEGIN_ARG_INFO_EX у тебя нигде в коде нет



но ведь есть функция zend_parse_parameters(), с помощью нее параметры и принимаются

84K
29 августа 2012 года
Paradiz
6 / / 29.08.2012
положил dll-ку в папку с пхп - все заработало

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог