2011-12-21 22 views
12

Mam projekt, który musi mieć dostęp do biblioteki DLL z PHP. Serwer to maszyna z systemem Windows, a serwer Apache jest dostarczany przez XAMPP.Używanie biblioteki DLL z PHP dla manekinów

Czytałem wiele odpowiedzi na internecie jak

Oto jak nazywam DLL w HTA/Javascript:

<object style="display:none" id="SOME_ID" classid="clsid:SOME_CLASS_ID" codebase="./somePath.dll"></object>

Czy ktoś ma przykład działa?

Oto, co starałem tak daleko w PHP:

$obj = new COM('pathTo.dll'); 

Informacja o DLL:

  1. Zestawione użyciu Delphi
  2. To jest (oczywiście) home made
  3. Pojawia się następujący błąd: the DllRegister Server entry point was not found podczas próby zarejestrowania biblioteki DLL za pomocą regsvr32

Czy można z niego korzystać bez rejestracji za pomocą regsvr32?

+0

Co znajduje CLSID z klasy COM? Podejrzewam, że nie tworzysz biblioteki DLL, która jest gotowa na współdziałanie COM ... –

+0

Wszystko, co kiedykolwiek przeczytałem na ten temat, mówi mi, że sposobem na zrobienie tego jest napisanie wrappera C++ dla biblioteki DLL, która może być wbudowana w PHP rozszerzenie i używać go w ten sposób. Nigdy nie próbowałem tego zrobić i nie mogę ci powiedzieć, jak to zrobić, ale natknąłem się na to pytanie wcześniej (byłeś powiązany z kilkoma osobami zadającymi to samo pytanie) i nigdy nie widziałem, aby ktoś mówił "Mam to do roboty" chyba że zbudowali rozszerzenie. – DaveRandom

+0

@ThorstenDittmar 'CLSID' jest ciągiem znaków alfanumerycznych o następującym formacie XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Co masz na myśli przez bibliotekę DLL gotową na współdziałanie COM –

Odpowiedz

9

Po utworzeniu pliku DLL należy użyć wartości module definition file. Będzie zawierać coś podobnego:

; 
;contains the list of functions that are being exported from this DLL 
; 

DESCRIPTION  "Simple COM object" 

EXPORTS 
       DllGetClassObject  PRIVATE 
       DllCanUnloadNow   PRIVATE 
       DllRegisterServer  PRIVATE 
       DllUnregisterServer  PRIVATE 

Ta definicja pozwala regsvr32 na znalezienie punktu wejścia DllRegisterServer.

Inną opcją, którą możesz spróbować, jest przekazanie flagi/n do regsvr32.

Regsvr32 [/ u] [/ N] [/ i [: CmdLine]] nazwa_dll

/u - Wyrejestrowanie serwer

/i - połączeń DllInstall przepuszczenie opcjonalne [CmdLine]; w przypadku użycia z/u wywołania dll odinstalować

/n - nie wywoływać DllRegisterServer; opcja ta musi być używana z/i

/s - Ciche; nie wyświetlaj okien komunikatów (dodanych w Windows XP i Windows Vista)

Ostatecznie, zanim spróbujesz stworzyć bibliotekę DLL z PHP, musisz się upewnić, że twoja biblioteka DLL działa w ogóle.

2

Biblioteka DLL nie może uzyskać dostępu z serwera Linux/Apache. Dlatego projekt się porzucił.

0

miałem ten sam problem i naprawiłem kilka kroków:

  1. otworzyć wiersz polecenia administratora w prawo (Windows + R + typ 'cmd') napisać ścieżkę, gdzie jesteś plik dll:
    C:\Windows\system32>regsvr32 xwizards.dll (to przykład)
    okno pokazać się z "sukcesu DLLRegisterServer"
  2. sprawdzić swoją phpinfo() jeśli jesteś com_dotnet przedłużenie
  3. teraz napisać w kodzie PHP:

    try { 
        $dll = new COM('<theNameOfDllFile>.<NameOfTheClass>'); //without extension '.dll' for theNameOfDllFile 
        $dll->Function(); 
        } catch(Exception $e){ 
        echo 'error: ' . $e->getMessage(), "\n";} 
    

    Teraz, gdy wiesz, jak zarządzać klasy i funkcję jesteś dll to będzie ok, jednak nie masaż błąd powinno pokazać się na ekranie


jeśli nie było jasne, daj mi znać, a ja zrobię mój najlepszy następnym razem :)