PDA

Ver la versión completa : Cómo usar en php DLLs implementadas en C++?



YadierDC
18-07-2008, 05:26
Hola:
Necesito usar DLLs en php5, pero que estas DLLs están implementadas en C++Builder6. Luego de incluir la dll en el php.ini he tratado de acceder a las funciones implementadas en la dll, de esta manera:
$objeto = new COM("Creando_dll.dll");
$valor_factorial=$objeto->FactorialNumero(5);
echo $valor_factorial;
Es entonces cuando me da un error y me dice algo así como que no puede crear el objeto COM, luego consulté en varias ayudas de php y encontré que si se trata de un DLL simple no hay forma de ejecutarla desde PHP. Si el archivo DLL contiene un servidor COM es posible que pueda acceder a él si implementa la interfaz IDispatch. Me pudieran decir cuánto de verdad hay en esto, de ser cierto cómo pudiera implementar el servidor COM en mi dll y la interfaz IDispatch. Gracias y disculpen la molestia.

Nost
18-07-2008, 10:05
No dupliques posts.

j8k6f4v9j
18-07-2008, 11:28
Hombre, debe ser cierto que haya que implementar algún tipo de interfaz a la que acogerse el resto. No pretenderemos ahora que cada lenguaje de programación se adapte a las librerías que mencionas. Son éstas las que deben proporcionar métodos de "acceso" a los lenguaes que las usen.

Supongo que te queda mucho por leer sobre php + dlls. Es algo muy específico y no veo que dispongas de mucha información técnica.

Salu2



http://img359.imageshack.us/img359/6631/celliigy4.pngKeep on Rollin' :mad:

gondar_f
22-07-2008, 09:41
tu código parece correcto, pero creo que da problemas con alguanas versiones de PHP. Actualmente hay otra forma (que también es posible usarla en Linux), por lo menos funciona con las dll de windows:

dl ("php_ffi.dll");

$windows = new ffi ("[lib='libreia.dll'] devuelve función(parametros)" );

echo $windows->función(parametros);

Espero haberte ayudado.

Un Saludo

YadierDC
22-07-2008, 16:23
mire le agradezco su ayuda, solo quisiera que me explicara un tin mejor su solución, es que hasta donde se ffi no conozco a ffi como una clase php, imagine que mi dll se nombra Elementos.dll, y que dentro tiene una función que se llama Factorial(int num), cómo quedaría el código pues la función dl(), si se que es para cargar la dll, quedaria asi:
dl("Elemento.dll");
pero no me queda claro la parte en que usted realiza el objeto para acceder a las funciones que están implementadas dentro de la dll, con este nombre de dll y función implementada dentro, cómo quedaría el resto del código, gracias.

gondar_f
23-07-2008, 19:29
Como quedaría con tu libreria:

dl("php_ffi.dll");
$potencia=new ffi("[lib='Creando_dll.dll'] int FactorialNumero(int)");
echo $pontencia->FactorialNumero(5);
Esta es una forma de hacerlo en Windows, aunque con cambios también sirve para Linux.
php_ffi.dll es una extensión de php 5 en adelante, y su función es sustituir al proyecto Win32api (que era para hacer llamadas a la api de windows, pero nunca funciono bien del todo porque jamás fue terminado)... precisamente si usas una versión de php inferior a la 5 pues lo que tienes que hacer es usar win32api. la directiva FFI en teoría es para usar la api win32 como ya comente, pero en la práctica funciona con cualquier dll registrada, y además actualmente es relativamente multiplataforma, aunque yo nunca vi usarla fuera de Windows.

Un Saludo

YadierDC
23-07-2008, 21:06
ahora entendí, ahora mismo lo pruebo, mil gracias.

YadierDC
23-07-2008, 21:24
me da estos errores
Warning: dl() [function.dl]: Not supported in multithreaded Web servers - use extension=php_ffi.dll in your php.ini in C:\AppServ\www\Probando_Tareas\Usar_DLL_Implementa da_Builder.php on line 27

Fatal error: Class 'ffi' not found in C:\AppServ\www\Probando_Tareas\Usar_DLL_Implementa da_Builder.php on line 28
Entonces inclui a php_ffi.dll en el php.ini(extension=php_ffi.ini), pero aún así no funciona, me sigue dando los errores sobre el uso de dl() y el de la clase ffi. Qué usted piensa sobre esto?

gondar_f
24-07-2008, 12:49
usa phpinfo() para conocer los datos de tu instalación de php, porque dependiendo de la versión, extensiones instaladas... pues la respuesta es distinta, esa respuesta era para un php v5 instalado de forma usual, veo que tu usas un appserv que es un paquete que te viene ya con todo (apache, mysql, php, phpnuke -este depende de la versión-...)...

Es muy posible que tengas que usar la extensión win32api si es una versión muy antigua, o que no te funcione (si no es muy antigua) porque no tienes instalada la php_ff.dll...

Intenta ver los datos de tu instalación y publicalos, a lo mejor puedo darte la solución.

Un Saludo

YadierDC
24-07-2008, 15:34
Si, yo lo que tengo instalado es el paquete AppServ, respecto a la version de php que el paquete trae es "PHP Version 5.1.6", además me fijé en la carpeta "ext" y traté de encontrar la dll "php_ffi.dll" pero no está.
Gracias.

YadierDC
25-07-2008, 21:20
Como le había dicho busqué en la carpeta "ext" y la dll "php_ffi.dll" no se encuentra, para poder usarla dígame si puedo bajar la dll de Internet, añadir la dll a esta carpeta y luego reiniciar el Apache. Le pregunto pues no he podido comprobar nada con la función dl(), estuve leyendo y encontré que esta función no se puede usar a partir de php5, si esto es cierto entonces que otra forma existe para poder cargar una dll, y porder usar las funciones que en ella estén implementadas.
Gracias.

gondar_f
26-07-2008, 10:24
Si se puede agregar, pero no es una extensiónd e apache, es de php, con lo cual no tienes que reiniciar apache, lo que si debes (aunque no es extrictamente necesario) es reiniciar el equipo.

Por otro lado, no es necesario usar la función dl(), ponerla es por motivos de compativilidad con algunas versiones un tanto caprichosas.

La web del FFI: http://pecl.php.net/package/ffi

Un Saludo

YadierDC
26-07-2008, 20:29
ya había bajado una version de php_ffi, la incluí en la carpeta ext, además la añadí en el php.ini con extension=php_ffi.dll, entonces el código quedaría así:

$fac=new ffi("[lib='Creando_dll.dll'] int FactorialNumero(int)");
echo $fac->FactorialNumero(5);

es decir sin usar la funcion dl(), pues ya está en la carpeta ext, pero de todas formas me sigue dando el error este:

Fatal error: Class 'ffi' not found in C:\AppServ\www\Probando_Tareas\Usar_DLL_Implementa da_Builder.php on line 39

No puede crear objetos de la clase ffi, qué me recomienda entonces?

gondar_f
28-07-2008, 18:16
Pues entonces prueba con win32api de la siguiente forma (aunque en teoría es para versiones anteriores):


$api = new win32;
$api->registerfunction("int FactorialNumero(int numero) from Creando_dll.dll");
echo $api->FactorialNumero(5);

Si esto te falla planteate una de estas opciones:
-dejar de usar el appserver y intalar el apache, php... de forma tradicional.

-si no necesitas una dll para nada más complejo, pues eso puedes hacerlo directamente en código php, aunque creo que este no es tu caso.

-crear un servicio web en ASP.NET para controlar el acceso a la dll y que así no tengas que llamarla directamente desde php, simplemente tendrías así que hacer uso de un servidio web, algo en donde no tendrás el más mínimo problema.

-Usar el propio C++Builder para crear una aplicación llamable por CGI para que te sirva de pasarela entre el php y las dlls.

...

Un Saludo