У меня наконец-то создал очень простое расширение PHP в стиле "Hello World" для Windows после неизмеримых хлопот.Однако, хотя я успешно создал DLL, поместил ее в папку расширений и рассказал об этом php.ini, теперь я получаю следующее:
Предупреждение PHP: Запуск PHP: \ x81 \ xc2 \ xc0 \x03L & \ xc0 \ x03: невозможно инициализировать модуль \ nМодуль, скомпилированный с модулем API = 16777522 \ nPHP, скомпилированный с модулем API = 20090626 \ nЭти параметры должны совпадать \ n в Неизвестно в строке 0 Предупреждение : запуск PHP: ÂÀL & À: невозможно инициализировать модуль Модуль, скомпилированный с модулем API = 16777522 PHP, скомпилированный с модулем API = 20090626 Эти параметры должны совпадать в Неизвестно в строке 0
Похоже, что мой PHP_API_VERSION - это 20090626, но по какой-то причине моя DLL считает, что это PHP_API_VERSION - 16777522.
Учебное пособие ниже было некоторой помощью при компиляции расширения dll: http://www.talkphp.com/vbarticles.php?do=article&articleid=49&title=creating-custom-php-extensions
Написав это сам, я имею доступ ко всему исходному коду для рассматриваемого расширения php - Но где же я контролирую PHP_API_VERSION, который заканчивается в DLL?
Я компилируюDLL успешно с Borland C ++ Builder v5.5, а не Visual Studio.
Вот полный исходный код на случай, если это имеет значение:
// Needed to make following two #includes compatible with borland header files
void __fastcall __assume(int t) {
return;
}
typedef unsigned int socklen_t;
typedef enum BOOL
{
false=0,
true
} bool;
// end Borland compatibility code
#include "php.h"
#include "zend_config.w32.h"
ZEND_FUNCTION(fetch_LinkGrammar_links);
zend_function_entry LinkGrammar_ext_functions[] = {
ZEND_FE(fetch_LinkGrammar_links, NULL)
{NULL, NULL, NULL}
};
zend_module_entry LinkGrammar_ext_module_entry = {
STANDARD_MODULE_HEADER,
"LinkGrammar Extension",
LinkGrammar_ext_functions,
NULL, NULL, NULL, NULL, NULL,
"1.0",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(LinkGrammar_ext);
ZEND_FUNCTION(fetch_LinkGrammar_links)
{
bool World = false;
char *RetVal= "";
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &World) == FAILURE)
{
RETURN_STRING("Missing Parameter", true);
}
if (World == true)
{
RetVal= "Hello World";
}
else
{
RetVal= "Hello";
}
RETURN_STRING(RetVal, true);
}
Что можно изменить, чтобы исключить запуск PHPОшибка в том, что API должен совпадать?