2011-12-21 17 views
12

Ho un progetto che deve accedere a una DLL con PHP. Il server è una macchina Windows e il server Apache è fornito da XAMPP.Utilizzo di una DLL con PHP for Dummies

ho letto più risposte sul web come

Ecco come io chiamo la DLL in HTA/Javascript:

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

Qualcuno ha un esempio di lavoro?

Ecco quello che ho provato finora in PHP:

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

Informazioni sul DLL:

  1. compilato utilizzando Delphi
  2. è (ovviamente) fatti in casa
  3. Ottengo il seguente errore the DllRegister Server entry point was not found quando provo a registrare la DLL con regsvr32

Può essere utilizzato senza registrarlo con regsvr32?

+0

Qual è il CLSID della classe COM? Sospetto che tu non stia creando una DLL pronta per l'interoperabilità COM ... –

+0

Tutto ciò che ho letto su questo argomento mi dice che il modo per farlo è scrivere un wrapper C++ per la DLL che può essere compilato in un PHP estensione, e usarlo in questo modo. Non ho mai provato a farlo e non posso dirti come, ma ho già incontrato la domanda (ti sei collegato a un paio di persone che hanno fatto la stessa domanda) e non ho mai visto nessuno dire "Ho capito che funziona" a meno che non abbiano costruito un'estensione. – DaveRandom

+0

@ThorstenDittmar 'CLSID' è una stringa stringa AlphaNumeric con il seguente formato XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Cosa intendi per DLL pronta per l'interoperabilità COM –

risposta

9

Quando si crea il file DLL, è necessario utilizzare uno module definition file. Esso contiene qualcosa di simile a questo:

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

Tale definizione permette regsvr32 per trovare il punto di ingresso DllRegisterServer.

Un'altra opzione che puoi provare è passare il flag/n su regsvr32.

Regsvr32 [/ u] [/ n] [/ i [: cmdline]] dllname

/u - Server Annulla la registrazione

/i - Call DllInstall passando come optional [cmdline]; se utilizzato con/u chiama dll uninstall

/n - non chiamare DllRegisterServer; questa opzione deve essere utilizzata con/i

/s - Silenzioso; visualizza nessuna finestra di messaggio (aggiunta con Windows XP e Windows Vista)

In definitiva, prima di provare a far funzionare una DLL con PHP, è necessario assicurarsi che la DLL funzioni in generale.

2

Una DLL non può accedere dal server Linux/Apache. Pertanto il progetto è stato interrotto.

0

Ho avuto lo stesso problema e ho fissato alcuni passaggi:

  1. aprire la riga di comando in diritti di amministratore (Windows + r + tipo 'cmd') scrivere il percorso in cui si è il file dll:
    C:\Windows\system32>regsvr32 xwizards.dll (è esempio)
    una vetrina con "successo DLLRegisterServer"
  2. controllare il phpinfo() se siete com_dotnet estensione
  3. ora scrivere nel vostro codice PHP:

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

    Ora se si sa come gestire la classe e la funzione dei sei dll che sta andando male, tuttavia nessun massaggio errore dovrebbe apparire sullo schermo


Se non sono stato chiaro fatemelo sapere e io farò del mio meglio la prossima volta :)