Работа c C++ Библиотекой Из Php Расширения
Проблема в следующем: есть простейшее 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);
?>
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));
}
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);
};
}
{
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;
}
}
#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;
}
}
В какой версии студии собиралась длл? Соотвествует ли версия msvc?
и кстати, само расширение вообще загружается?
Цитата: kot_
В какой версии студии собиралась длл? Соотвествует ли версия msvc?
vc 9
да все либы и непосредственно php собирались в vc 9
Цитата: kot_
и кстати, само расширение вообще загружается?
загружается, причем если закомментить функцию PHP_FUNCTION(mul), то все нормально работает
и еще. у тебя функция должна принимать параметры. Но вызова ZEND_BEGIN_ARG_INFO_EX у тебя нигде в коде нет
Цитата: kot_
ошибок нет
Цитата: kot_
и еще. у тебя функция должна принимать параметры. Но вызова ZEND_BEGIN_ARG_INFO_EX у тебя нигде в коде нет
но ведь есть функция zend_parse_parameters(), с помощью нее параметры и принимаются
положил dll-ку в папку с пхп - все заработало