Hallo,
ich bin ganz neu hier und das, weil ich bei einem Problem einfach nicht weiter weiß. Vielleicht kann mir jemand den entscheidenden Tipp geben zur Lösung des Problems.
Lange Rede, kurzer Sinn, es geht um die Erstellung einer PHP Extension die eine andere DLL (keine PHP Bibliothek) einbindet und Funktionen aus dieser verwenden soll.
Das ganze programmiere ich in Visual Studio C++ 2005 (Express Edition).
Eine simple Extension, die anhand von Parametern eine Berechnung macht oder einen Paramter als Text ausgibt, habe ich geschrieben (unter Zuhilfenahme dieses Tutorials) und sie funktioniert auch in meiner PHP Umgebung (Windows Server 2003, IIS, PHP, MySQL).
Gehe ich nun jedoch dazu über, eine externe Bibliothek einzubinden, kompiliere das ganze (ohne Fehler) und lade diese Extension in PHP, so funktionieren weder die vormals lauffähigen Funktionen noch die neuen, die auf die externe DLL zugreifen. Genauer gesagt wird die Extension nicht mal von PHP geladen, denn sie taucht in der php.ini nicht mehr auf.
Die externe DLL ist eine Windows DLL des Little Color Management.
Im Anschluss habe ich mal meinen Code der Extension, woran vielleicht schon erkannt werden kann, was mein Fehler ist.
Die Kompilierung des Projektes funktioniert, wie bereits geschrieben, tadellos. Ich habe Zugriff auf die Methoden der lcms DLL.
Wenn diese nun kompilierte Extension jedoch eingebunden werden soll, wird sie das nicht. In der Windows Ereignisanzeige konnte ich keinen Eintrag finden, dass die DLL beim Starten des IIS nicht korrekt geladen werden konnte, daher weiß ich leider auch nicht weiter, wie ich herausfinden kann, woran es liegt.
Die lcms DLL habe ich sowohl im Linker des Projektes mit der zugehörigen .lib angegeben, als auch wie zu sehen, die Header Datei in die Quelltextdatei eingebunden.
Bis denne, Han Solo
ich bin ganz neu hier und das, weil ich bei einem Problem einfach nicht weiter weiß. Vielleicht kann mir jemand den entscheidenden Tipp geben zur Lösung des Problems.
Lange Rede, kurzer Sinn, es geht um die Erstellung einer PHP Extension die eine andere DLL (keine PHP Bibliothek) einbindet und Funktionen aus dieser verwenden soll.
Das ganze programmiere ich in Visual Studio C++ 2005 (Express Edition).
Eine simple Extension, die anhand von Parametern eine Berechnung macht oder einen Paramter als Text ausgibt, habe ich geschrieben (unter Zuhilfenahme dieses Tutorials) und sie funktioniert auch in meiner PHP Umgebung (Windows Server 2003, IIS, PHP, MySQL).
Gehe ich nun jedoch dazu über, eine externe Bibliothek einzubinden, kompiliere das ganze (ohne Fehler) und lade diese Extension in PHP, so funktionieren weder die vormals lauffähigen Funktionen noch die neuen, die auf die externe DLL zugreifen. Genauer gesagt wird die Extension nicht mal von PHP geladen, denn sie taucht in der php.ini nicht mehr auf.
Die externe DLL ist eine Windows DLL des Little Color Management.
Im Anschluss habe ich mal meinen Code der Extension, woran vielleicht schon erkannt werden kann, was mein Fehler ist.
PHP-Code:
#include "stdafx.h"
#include "LittleCMS.h"
/* declaration of functions to be exported */
ZEND_FUNCTION(DoubleUp);
PHP_FUNCTION(hello_greetme);
PHP_FUNCTION(convert_rgb_to_cmyk);
/* compiled function list so Zend knows what's in this module */
zend_function_entry CustomExtModule_functions[] = {
ZEND_FE(DoubleUp, NULL)
PHP_FE(hello_greetme, NULL)
PHP_FE(convert_rgb_to_cmyk, NULL)
{NULL, NULL, NULL}
};
/* compiled module information */
zend_module_entry CustomExtModule_module_entry = {
STANDARD_MODULE_HEADER,
"CustomExt Module",
CustomExtModule_functions,
NULL, NULL, NULL, NULL, NULL,
NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
};
/* implement standard "stub" routine to introduce ourselves to Zend */
ZEND_GET_MODULE(CustomExtModule)
/* DoubleUp function */
/* This method takes 1 parameter, a long value, returns the value multiplied by 2 */
ZEND_FUNCTION(DoubleUp)
{
long paramValue = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", ¶mValue) == FAILURE) {
RETURN_STRING("Bad parameters!", true);
}
paramValue *= 2;
RETURN_LONG(paramValue);
}
/* hello_greetme function */
/* This method takes 1 parameter, a string value, returns the value combined with a Hello... */
PHP_FUNCTION(hello_greetme)
{
char *name;
int name_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
RETURN_NULL();
}
php_printf("Hello %s ", name);
RETURN_TRUE;
}
/* Transform an image from RGB->CMYK */
/* This method takes 3 parameters:
- a string with the rgb profile filename
- a string with the cmyk profile filename
- a string with the image file to be transformed */
PHP_FUNCTION(convert_rgb_to_cmyk)
{
char *imagefilename;
char *rgbprofilename;
char *cmykprofilename;
CLittleCMS cms;
cmsHPROFILE profileRgb;
cmsHPROFILE profileCMYK;
if(!cms.init("LCMS.DLL"))
{
printf("Failed to load the lcms DLL\n");
//return(0);
}
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &imagefilename, &rgbprofilename, &cmykprofilename) == FAILURE)
{
RETURN_STRING("Wrong parameters!", true);
}
// Load ICC profiles
profileRgb = cms.cmsdOpenProfileFromFile(rgbprofilename, "r");
profileCMYK = cms.cmsdOpenProfileFromFile(cmykprofilename, "r");
php_printf("Opened Profile: %s ", cms.cmsdTakeProductName(profileRgb));
php_printf("Opened Profile: %s ", cms.cmsdTakeProductName(profileCMYK));
cms.cmsdCloseProfile(profileRgb);
cms.cmsdCloseProfile(profileCMYK);
RETURN_TRUE;
}
Wenn diese nun kompilierte Extension jedoch eingebunden werden soll, wird sie das nicht. In der Windows Ereignisanzeige konnte ich keinen Eintrag finden, dass die DLL beim Starten des IIS nicht korrekt geladen werden konnte, daher weiß ich leider auch nicht weiter, wie ich herausfinden kann, woran es liegt.
Die lcms DLL habe ich sowohl im Linker des Projektes mit der zugehörigen .lib angegeben, als auch wie zu sehen, die Header Datei in die Quelltextdatei eingebunden.
Bis denne, Han Solo
Kommentar