計り知れない手間をかけた後、ようやく非常に単純な「Hello World」スタイルの PHP 拡張 dll を Windows で作成しました。ただし、DLL を正常に作成し、それを拡張機能フォルダーに配置し、それについて php.ini に通知しましたが、次のようになります。
PHP 警告: PHP の起動: \x81\xc2\xc0\x03L&\xc0\x03: モジュールを初期化できません\nモジュール API=16777522 でコンパイルされたモジュール\nモジュール API=20090626 でコンパイルされた PHP\nこれらのオプションは一致する必要があります\n行 0
警告: PHP の起動: ÀL&À: モジュールを初期化できません モジュール API=16777522 でコンパイルされたモジュール モジュール API=20090626 でコンパイルされた PHP これらのオプションは、行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 拡張機能のすべてのソース コードにアクセスできます。
Visual Studio ではなく、Borland C++ Builder v5.5 で dll を正常にコンパイルしています。
重要な場合に備えて、完全なソースを次に示します。
// 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);
}
API が一致しなければならない PHP 起動エラーをなくすには、何を変更すればよいですか?