2009-07-07 117 views
5

No voy a mentir. No estoy familiarizado con los objetos de Windows y COM. Es por eso que estoy aquí. En primer lugar, ¿es posible acceder a un archivo DLL desde un script PHP que se está quedando sin Apache? En mi viaje alrededor de los internets creo que tengo 2 opciones:¿Usar DLL en PHP?

  1. compilar el dll como una extensión para PHP. (No hice esto dll)
  2. acceder a la DLL como un objeto COM que es algo así como lo que está diseñado para todos modos.

Así que estoy tomando el enfoque COM.

try{ 
    $com = new COM('WHAT_GOES_HERE'); 
} catch(Exception $e){ 
    echo 'error: ' . $e->getMessage(), "\n"; 
} 

¿Qué debo hacer para saber qué incluiría en la cadena de inicialización? ¿Hay algún programa de tipo com viewer que pueda/deba usar para averiguarlo? la documentación asociada con este archivo DLL no parece especificar qué cadenas debo usar para inicializar, pero se profundiza en las transmisiones disponibles y todo tipo de cosas divertidas. Solo tengo que pasar esta joroba inicial. ¡Por favor ayuda!

Respuesta

4

WHAT_GOES_HERE es el ProgID, Class ID o Moniker registrado en el sistema operativo.

Cada uno de estos puede cambiar por la misma DLL registrada en diferentes máquinas. Hay varias formas de encontrar qué es ProgID/CLSID/Moniker de un dll registrado. Puede buscar "depurador dll", "exportar dll", "inspeccionar dll" en la web y verá varias soluciones, y también maneras de mostrar qué funciones exporta el dll para que pueda usarlas.

La manera más fácil, puede simplemente registrar el dll con Regsvr32.exe y buscar en el registro de Windows con regedit.exe para el nombre del DLL, es posible que necesite buscar varias veces hasta encontrar la clave en \HKEY_CLASSES_ROOT\, que es el ProgID .

El comando dcomcnfg.exe muestra mucha información acerca de los objetos COM.

Si tiene Visual Studio, el Visor de objetos OLE/COM (oleview.exe) podría ser útil.

1

Puede ejecutar funciones dll (desde dlls que no sean extensiones php) con winbinder. http://winbinder.org/ Usarlo es simple. Debe descargar php_winbinder.dll e incluirlo en php.ini como extensión. En el script php que tienen que usar algo similar:

function callDll($func, $param = "") 
{ 
    static $dll = null; 
    static $funcAddr = null; 
    if ($dll === null) 
    { 
     $dll = wb_load_library(<DLL PATH AND FILENAME>); 
    } 
    $funcAddr = wb_get_function_address($func, $dll); 
    if ($param != "") 
    { 
     return wb_call_function($funcAddr,array(mb_convert_encoding($param,"UTF-16LE"))); 
    } 
    else 
    { 
     return wb_call_function($funcAddr); 
    } 
} 
+0

Winbinder no se ha actualizado desde 2010 y parece ser un proyecto de OSS muerto por desgracia. :( – DavidScherer

1

Simplemente puede desarrollar una envoltura alrededor de su DLL principal y utilizar este contenedor como una extensión de su PHP. Algunas herramientas gratuitas como SWIG pueden generar este contenedor automáticamente obteniendo el encabezado de sus funciones dll. Yo mismo uso este enfoque y fue fácil y confiable.