2009-07-07 15 views
5

Ich werde nicht lügen. Ich bin nicht vertraut mit Windows und COM-Objekten. Darum bin ich hier. Zuallererst ist es möglich, auf eine DLL aus einem PHP-Skript zuzugreifen, das keinen Apache mehr hat? In meiner Reise um das Internet glaube ich, dass ich 2 Optionen habe:Verwenden DLL in PHP?

  1. kompilieren Sie die DLL als eine Erweiterung für PHP. (Ich habe diese DLL nicht gemacht)
  2. Zugriff auf die DLL als ein COM-Objekt, das ist eine Art von dem, was es sowieso entworfen ist.

So nehme ich den COM-Ansatz.

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

Wie kann ich herausfinden, was in den Initialisierungsstring gehen würde? Gibt es ein com viewer Programm, das ich benutzen könnte, um das herauszufinden? Die mit dieser DLL verknüpfte Dokumentation scheint nicht anzugeben, welche Strings ich verwenden sollte, um sie zu initialisieren, sondern geht sehr detailliert darauf ein, welche Streams verfügbar sind, und alle möglichen Arten von Spaß. Ich muss einfach diesen ersten Buckel hinter mir lassen. Bitte helfen Sie!

Antwort

4

WHAT_GOES_HERE ist die auf dem Betriebssystem registrierte ProgID, Class ID oder Moniker.

Jede dieser kann ändern für die gleiche DLL auf verschiedenen Maschinen registriert. Es gibt mehrere Möglichkeiten zu finden, was der ProgID/CLSID/Moniker einer registrierten DLL ist. Sie können das Web nach "dll debugger", "dll export", "dll inspect" durchsuchen und Sie werden mehrere Lösungen sehen, und auch Möglichkeiten zu zeigen, welche Funktionen der DLL-Export, so dass Sie sie verwenden können.

Der einfachste Weg, können Sie einfach registrieren die dll mit Regsvr32.exe und Windows-Register mit regedit.exe für die DLL-Namen suchen, müssen Sie möglicherweise mehrmals suchen, bis Sie den Schlüssel unter \HKEY_CLASSES_ROOT\, die ProgID ist .

Der Befehl dcomcnfg.exe zeigt viele Informationen über COM-Objekte.

Wenn Sie Visual Studio haben, könnte die OLE/COM-Objektanzeige (oleview.exe) nützlich sein.

1

Sie können DLL-Funktionen (von DLLs, die nicht PHP-Erweiterungen sind) mit Winbinder ausführen. http://winbinder.org/ Die Verwendung ist einfach. Sie müssen php_winbinder.dll herunterladen und als Erweiterung in die php.ini einbinden. Im PHP-Skript müssen Sie etwas ähnliches verwenden:

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 wurde seit 2010 nicht mehr aktualisiert und scheint leider ein totes OSS-Projekt zu sein. :( – DavidScherer

1

Sie einfach einen Wrapper um Ihren Haupt-DLL entwickeln und diese Wrapper als Erweiterung in Ihrer PHP verwenden. Einige kostenlose Tools wie SWIG können diesen Wrapper für Sie automatisch generieren, indem Sie den Header Ihrer DLL-Funktionen erhalten. Ich selbst benutze diesen Ansatz und es war einfach und zuverlässig.

Verwandte Themen