8
votes

Utiliser dll dans php?

Je ne vais pas mentir. Je ne suis pas tous familiers avec Windows et COMBES COM. C'est la raison pour laquelle je suis là. Tout d'abord, il est possible d'accéder à une DLL à partir d'un script PHP à court d'Apache? Dans mon voyage autour des internets, je crois que j'ai 2 options:

  1. compilez la DLL comme une extension pour PHP. (Je n'ai pas fait cette DLL) li>
  2. Accédez à la DLL en tant qu'objet COM qui est en quelque sorte ce qu'il est conçu pour toute façon. li> ol>

    Donc, je prends l'approche COM. P>

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


0 commentaires

3 Réponses :


5
votes

What_goes_Here est l'identifiant PROGID, la classe ID ou le moniker enregistré sur le système d'exploitation.

Chacun de ces CAN Changement de la même DLL enregistré sur différentes machines. Il existe plusieurs façons de trouver ce qui est le PROGID / CLSID / Moniker d'une DLL enregistrée. Vous pouvez rechercher sur le Web pour "DLL Debugger", "DLL Exporter", "DLL Inspect" et vous verrez plusieurs solutions, ainsi que des moyens de montrer les fonctions de l'exportation DLL afin que vous puissiez les utiliser.

Le moyen le plus simple, vous pouvez simplement enregistrer la DLL avec regsvr32.exe et le registre de la fenêtre de recherche avec Regedit.exe pour le nom de la DLL, vous devrez peut-être rechercher plusieurs fois jusqu'à ce que vous trouviez la clé sous \ hkey_classes_root \ < / code>, qui est le progrès.

La commande dcommnfg.exe montre beaucoup d'informations sur les objets COM.

Si vous avez Visual Studio, le visualiseur d'objets OLE / COM (OLEVIEW.EXE) pourrait être utile.


0 commentaires

3
votes

Vous pouvez exécuter des fonctions DLL (à partir de DLL qui ne sont pas des extensions PHP) avec Winbinder. http://winbinder.org/ En utilisant c'est simple. Vous devez télécharger php_winbinder.dll et l'inclure dans php.ini comme une extension. Dans le script PHP, vous devez utiliser quelque chose de similaire:

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


2 commentaires

Winbinder n'a pas été mis à jour depuis 2010 et semble être un projet MORT OSSH malheureusement. :(


Je ne sais pas ce qui s'est passé avec le site que j'ai mentionné, mais on dirait que le projet est toujours maintenu ici: Github. Com / DarkSynx / Winbinder-php7



2
votes

Vous pouvez simplement développer une enveloppe autour de votre DLL principale et utiliser cette enveloppe comme extension de votre PHP. Certains outils gratuits tels que Swig peuvent générer cette enveloppe pour vous automatiquement en obtenant l'en-tête de vos fonctions DLL. J'utilise moi-même cette approche et c'était facile et fiable.


0 commentaires