Resultados 1 al 14 de 14

Cómo usar en php DLLs implementadas en C++?

  1. #1 Cómo usar en php DLLs implementadas en C++? 
    Iniciado
    Fecha de ingreso
    Jul 2008
    Mensajes
    8
    Descargas
    0
    Uploads
    0
    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.
    Citar  
     

  2. #2  
    Avanzado
    Fecha de ingreso
    Jun 2006
    Mensajes
    1.462
    Descargas
    15
    Uploads
    0
    No dupliques posts.
    Citar  
     

  3. #3  
    Moderador Global
    Fecha de ingreso
    Aug 2005
    Mensajes
    6.279
    Descargas
    7
    Uploads
    0
    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


    Keep on Rollin'

    . . . . . . . . . . . . . . . . . . . .
    [[ NORMAS DEL FORO ]]
    . . . . . . . . . . . . . . . . . . . .
    __________
    Citar  
     

  4. #4  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    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
    He conocido muchos dioses. Quien niegue su existencia está tan ciego como el que confía en ellos con una fe desmesurada. Robert E. Howard
    La suerte ayuda a la mente preparada.
    Citar  
     

  5. #5 expliqueme mejor 
    Iniciado
    Fecha de ingreso
    Jul 2008
    Mensajes
    8
    Descargas
    0
    Uploads
    0
    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.
    Citar  
     

  6. #6  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    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
    He conocido muchos dioses. Quien niegue su existencia está tan ciego como el que confía en ellos con una fe desmesurada. Robert E. Howard
    La suerte ayuda a la mente preparada.
    Citar  
     

  7. #7 ahora lo pruebo 
    Iniciado
    Fecha de ingreso
    Jul 2008
    Mensajes
    8
    Descargas
    0
    Uploads
    0
    ahora entendí, ahora mismo lo pruebo, mil gracias.
    Citar  
     

  8. #8 errores 
    Iniciado
    Fecha de ingreso
    Jul 2008
    Mensajes
    8
    Descargas
    0
    Uploads
    0
    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?
    Citar  
     

  9. #9  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    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
    He conocido muchos dioses. Quien niegue su existencia está tan ciego como el que confía en ellos con una fe desmesurada. Robert E. Howard
    La suerte ayuda a la mente preparada.
    Citar  
     

  10. #10  
    Iniciado
    Fecha de ingreso
    Jul 2008
    Mensajes
    8
    Descargas
    0
    Uploads
    0
    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.
    Citar  
     

  11. #11  
    Iniciado
    Fecha de ingreso
    Jul 2008
    Mensajes
    8
    Descargas
    0
    Uploads
    0
    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.
    Citar  
     

  12. #12  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    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
    He conocido muchos dioses. Quien niegue su existencia está tan ciego como el que confía en ellos con una fe desmesurada. Robert E. Howard
    La suerte ayuda a la mente preparada.
    Citar  
     

  13. #13  
    Iniciado
    Fecha de ingreso
    Jul 2008
    Mensajes
    8
    Descargas
    0
    Uploads
    0
    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?
    Citar  
     

  14. #14  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    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
    He conocido muchos dioses. Quien niegue su existencia está tan ciego como el que confía en ellos con una fe desmesurada. Robert E. Howard
    La suerte ayuda a la mente preparada.
    Citar  
     

Temas similares

  1. Cómo usar un PC con Debian como repetidor de una red Wireless
    Por Fruit en el foro REDES Y TECNOLOGIAS WIRELESS
    Respuestas: 3
    Último mensaje: 11-09-2010, 06:02
  2. Como puedo Usar mi Motorola V3m Como Modem Gratis
    Por Junior352 en el foro REDES Y TECNOLOGIAS WIRELESS
    Respuestas: 1
    Último mensaje: 04-05-2009, 00:37
  3. Dlls en visualBasic
    Por Marchi en el foro PROGRAMACION DESKTOP
    Respuestas: 5
    Último mensaje: 22-11-2004, 03:28
  4. Respuestas: 2
    Último mensaje: 10-09-2002, 23:31
  5. como usar una cuenta host de arnet adsl como proxy
    Por darthMenem en el foro INGENIERIA INVERSA
    Respuestas: 1
    Último mensaje: 14-06-2002, 04:30

Marcadores

Marcadores