2010-11-07 29 views
1

J'ai enfin a créé un très simple "PHP" style PHP Extension DLL sur les fenêtres, après incommensurable tracas. Cependant, bien que j'ai réussi à créer une DLL, et l'ai placée dans le dossier des extensions, et j'en ai parlé à php.ini, je reçois maintenant ceci:Compilation PHP Extension avec la version API correcte sur Windows

PHP Avertissement: PHP Startup: \ x81 \ xc2 \ xc0 \ x03L & \ xc0 \ x03: Impossible d'initialiser le module \ nModule compilé avec l'API de module = 16777522 \ NPHP compilé avec l'API de module = 20090626 \ options nCes doivent correspondre \ n in Unknown on line 0
Avertissement: PHP Startup: AAL & À: Impossible d'initialiser le module Module compilé avec le module API = 16777522 PHP compilé avec le module API = 20090626 Ces options doivent correspondre à dans Unknown en ligne

Il semble que mon PHP_API_VERSION est 20090626, mais pour une raison quelconque ma DLL pense qu'il est PHP_API_VERSION est 16777522.

Le tutoriel ci-dessous était un peu d'aide dans la compilation d'une dll d'extension: Ayant écrit moi-même, j'ai accès à tout le code source de l'extension php en question - Mais, où est-ce que je contrôle le PHP_API_VERSION qui se retrouve dans la DLL?

Je compile la DLL avec succès avec Borland C++ Builder v5.5, pas Visual Studio.

Voici la source complète, dans le cas où il importe:

// 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); 
} 

Que puis-je changer pour éliminer l'erreur de démarrage PHP que l'API doit correspondre?

Répondre

1

Il s'est avéré que c'était "l'alignement des données" - ma DLL était en cours de compilation en utilisant l'alignement "Word" et il devait être double-mot.

0

On dirait que vous compilez sur une version différente de PHP que celle que vous utilisez. Jetez un coup d'oeil dans php.h et cherchez #define PHP_API_VERSION - c'est ce que vous compilez.

Est-ce la même version qui tourne sur votre serveur?

0

Vérifiez vos chemins d'accès, recherchez le fichier php.h et vérifiez que la version correspondante correspond à php que vous utilisez (la version courante est trouvée si vous vérifiez la sortie de phpinfo()).

0

Vous devez remplacer la version API de zend_modules.h par la version de l'API indiquée par votre serveur PHP dans phpinfo(). Par exemple, si l'API PHP Extension dans phpinfo() est 20090523, vous devez changer le numéro d'API dans le fichier zend_modules.h en 20090523, puis reconstruire votre projet.