2009-07-07 12 views
5

Nie zamierzam kłamać. Nie jestem zaznajomiony z obiektami Windows i COM. Dlatego tu jestem. Przede wszystkim jest to możliwe, aby uzyskać dostęp do biblioteki DLL z poziomu skryptu PHP kończącego się Apache? W mojej podróży do Internetu uważam, że mam 2 opcje:Użyj DLL w PHP?

  1. skompilować dll jako rozszerzenie dla PHP. (nie zrobiłem tego dll)
  2. dostęp do biblioteki DLL jako obiekt COM, który jest swego rodzaju za to, co zostało zaprojektowane dla anyways.

Przyjmuję podejście COM.

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

W jaki sposób mogę dowiedzieć się, co można znaleźć w ciągu inicjującym? czy istnieje program typu com viewer, który mógł/powinienem użyć, aby to znaleźć? Dokumentacja związana z tą biblioteką DLL wydaje się nie określać, które ciągi powinny być używane do inicjowania, ale bardzo dogłębnie określa, jakie strumienie są dostępne, i wszelkiego rodzaju zabawnych rzeczy. Muszę minąć ten początkowy garb. Proszę pomóż!

Odpowiedz

4

WHAT_GOES_HERE to identyfikator ProgID, Class ID lub Moniker zarejestrowany w systemie operacyjnym.

Każda z tych może zmienić dla tej samej biblioteki DLL zarejestrowanej na różnych komputerach. Istnieje kilka sposobów, aby znaleźć to, co jest ProgID/CLSID/Moniker zarejestrowanej biblioteki dll. Możesz przeszukiwać sieć pod kątem "debuggera dll", "eksportu dll", "inspekcji dll", a zobaczysz kilka rozwiązań, a także sposoby, aby pokazać, jakie funkcje eksportuje dll, dzięki czemu można z nich korzystać.

Najprostszym sposobem jest zarejestrowanie biblioteki DLL za pomocą programu Regsvr32.exe i wyszukanie rejestru Window z plikiem regedit.exe dla nazwy biblioteki DLL; może być konieczne przeszukanie kilkukrotnie, aż znajdziesz klucz pod numerem \HKEY_CLASSES_ROOT\, który jest ProgID .

Komenda dcomcnfg.exe pokazuje wiele informacji o obiektach COM.

Jeśli masz program Visual Studio, może być przydatna przeglądarka obiektów OLE/COM (oleview.exe).

1

Możesz uruchomić funkcje dll (z biblioteki dll, które nie są rozszerzeniami php) z winbinderem. http://winbinder.org/ Korzystanie z niego jest proste. Musisz pobrać plik php_winbinder.dll i dołączyć go do pliku php.ini jako rozszerzenie. W skrypcie php trzeba użyć coś podobnego:

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 nie był aktualizowany od 2010 roku i wydaje się być smutnym projektem OSS. :( – DavidScherer

1

można po prostu rozwinąć owijkę wokół głównej dll i użycia tej owijki jako przedłużenie w swoim PHP. Niektóre darmowe narzędzia, takie jak SWIG, mogą automatycznie wygenerować to opakowanie, pobierając nagłówek funkcji biblioteki DLL. Ja sam używam tego podejścia i było to łatwe i niezawodne.

Powiązane problemy