PDA

View Full Version : Differenza tra DLL e OCX


Mantis-89
28-04-2009, 11:59
Salve a tutti,
qualcuno potrebbe gentilmente spiegarmi la differenza tra dll e ocx?
Ho creato un piccolo programmino(in c++) a riga di comando che accetta dei parametri in ingresso e mi stampa a video una stringa. Partendo da questo vorrei richiamarlo da un altra apllicazione e per questo credo mi serva una dll o un ocx.

Grazie in anticipo.

71104
28-04-2009, 12:33
non credo ti serva nessuno dei due, basta che fai il redirect degli standard streams impostando gli handles di tre pipes nella struttura STARTUPINFO che passi alla CreateProcess.

comunque una DLL é un modulo eseguibile che puó esportare simboli (dove per simboli si intende solitamente variabili e funzioni) ed essere caricato da processi che importano i simboli esportati; un OCX invece é una DLL contenente un controllo ActiveX, quindi un server COM in-process; fondamentalmente un server COM in-process é una DLL che esporta quattro funzioni:

DllRegisterServer - funzione che installa il server sul computer registrandolo nel registro di sistema
DllUnregisterServer - funzione che disinstalla il server
DllCanUnloadNow - funzione dal nome autoesplicativo richiamata dagli algoritmi ottimizzati di COM per gestire il caricamento dei server in-process all'interno dei processi
DllGetClassObject - funzione che restituisce il factory object implementato dal server in-process, cioé un oggetto che espone l'interfaccia IClassFactory o IClassFactory2 e che permette l'istanziamento degli oggetti implementati dal server (quindi degli oggetti ActiveX nel caso di un OCX)


se non hai capito neanche una parola allora lascia perdere DLL e OCX, non é roba da 5 minuti; la CreateProcess invece si impara in fretta.

Mantis-89
28-04-2009, 12:57
se non hai capito neanche una parola allora lascia perdere DLL e OCX, non é roba da 5 minuti; la CreateProcess invece si impara in fretta.

mm.. qualcosa ho capito dai :D

Provo a spiegarti meglio il mio problema: l'applicazione principale è scritta in Visual FoxPro, però visto che non è il massimo dal punto di vista della sicurezza del codice vorremmo "esternare" alcune funzioni importanti scrivendole in un linguaggio più sicuro. Per questo ho scelto il c++ e ho realizzato un programmino di prova.

Secondo te tra dll e ocx quale mi conviene? Se non ho capito male tramite l'ocx potrei creare un oggetto all'interno del mio programma e utilizzarne le funzioni quando voglio giusto? Mentre con la dll non avrei un vero e proprio oggetto ma mi limiterei a richiamare le funzioni che ho creato..?
Spero di aver capito qualcosa di giusto.

Cmq non mi preoccupa il fatto di perderci del tempo, voglio che venga fuori un bel lavoro e sono disposto a studiarmi bene la cosa. Mi basta sapere da cosa partire e cosa mi serve per andare avanti.

Grazie :) .

71104
28-04-2009, 19:38
non ho mai usato Visual FoxPro e quindi non ho idea di come sia possibile dal suo interno utilizzare una DLL o un OCX, quindi in altre parole non risponderti :p

per quanto riguarda la differenza tra DLL e OCX credo che tu abbia intuito bene: una DLL non fa che esportare simboli (nella stragrande maggioranza dei casi funzioni) che possono essere richiamate da altri moduli eseguibili, quindi in sostanza una DLL é una "libreria" di codice riutilizzabile; DLL sta proprio per Dynamic-Link Library.
un OCX invece é una DLL che implementa un tipo specifico di server COM: si tratta infatti di un server COM in-process che permette di istanziare oggetti ActiveX, cioé oggetti COM che espongono determinate interfacce.

se hai la possibilitá dall'interno di Visual FoxPro di invocare le funzioni esportate da una DLL allora la strada della DLL é di gran lunga preferibile a quella dell'OCX perché devi apprendere un centesimo delle cose; per gli OCX invece ti avverto, é molto lunga :D peró c'é da dire che quando avrai studiato una tecnologia cosi importante e tutt'oggi ancora cosi influente nonostante .NET avrai capito molto dell'universo user-mode di Windows, compreso il motivo percui il DLL Hell non é mai esistito (é un problema inventato dalle terze parti che poi ovviamente é toccato a Microsoft risolvere).

questo é il punto di partenza per le DLL:
http://msdn.microsoft.com/en-us/library/ms682589(VS.85).aspx

per gli OCX invece devi partire da qui:
http://msdn.microsoft.com/en-us/library/ms680573(VS.85).aspx

studiandoti i seguenti argomenti (quello che non ho segnato puoi saltarlo a pié pari, il problema é che ho segnato quasi tutto :asd:):

in COM Fundamentals:

The Component Object Model
Processes, Threads and Apartments
COM Clients and Servers
Defining COM Interfaces (salta qualunque cosa parli di proxy/stub e marshalling, non dovrebbe servire per un ActiveX)
Registering COM Applications
Error Handling in COM (questo é una cazzata e probabilmente se ci arriverai sará inutile leggerlo perché saprai giá tutto)
Events in COM and Connectable Objects
Component Categories Manager Implementation (questo non ricordo se serve per gli OCX, credo di si, ma se arrivi a studiare fin li sará oltremodo facile)


in Controls and Property Pages, naturalmente tutto :p anche se forse le Property Pages non ti serviranno (dipende da cosa vuoi realizzare).

in Automation Programming Reference:

Overview of Automation
Exposing ActiveX Objects
Accessing ActiveX Objects
...

in quest'ultima sezione avrai piu volte la sensazione che ti stia ripetendo per la milionesima volta cose giá dette nelle due sezioni precedenti. i puntini di sospensione finali stanno a significare "per il resto boh, vedi tu :D"; tanto arrivato a quel punto o saprai tutto quello che serve di sapere o sarai ampiamente in grado di giudicare se ti serve di sapere qualcos'altro.

per finire, la sezione su MIDL (Microsoft Interface Definition Language) la consulterai piu che altro come reference del linguaggio MIDL che avrai appreso giá nelle sezioni precedenti, mentre lo Structured Storage credo proprio che lo salterai (parla dei meccanismi che servono a rendere persistente un oggetto COM, cioé come gestire il "salvataggio" del tuo oggetto su file e come "ripristinarlo". sapevi che la shell di Windows vede tutto come un oggetto OLE? :D).


per quanto riguarda la sezione fondamentale, COM Fundamentals, puoi saltare tutta la parte relativa al marshalling (che non avviene mai per i controlli ActiveX locali), ai proxy/stub e alla sicurezza; se poi, in seguito, ti rendi conto che ti é utile anche la parte sulla sicurezza, allora studiati anche quella.
per darti un'idea di cosa faccia il sistema di sicurezza di DCOM* ti dico molto sinteticamente che serve ad autenticare i client che fanno uso di oggetti COM e a proteggere ogni singolo metodo di un oggetto COM da chiamate provenienti da client autenticati con identitá non autorizzate; si tratta di un sistema robusto basato a sua volta sul sistema di sicurezza del sistema operativo.

* COM e DCOM sono quasi la stessa cosa: DCOM sta per Distributed COM e si parla di DCOM anziché di COM quando si parla di server COM che girano su macchine remote; non ha senso parlare di sicurezza in COM perché se il server é locale puó essere facilmente hackerato, specialmente se é un server in-process e specialmente se usa un threading model tale da non aver bisogno di un proxy per il marshalling (a quel punto il sistema di sicurezza é totalmente assente visto che é implementato proprio dai proxy/stub).

Mantis-89
29-04-2009, 08:58
Per utilizzare una dall in FoxPro dovrebbe dovrebbe essere questo:
DECLARE TipoRestituito NomeFunzione IN NomeDLL.dll TipoParametro1 @, TipoParametro2 @, ....
per ogni funzione che si vuole utilizzare della dll.
Ieri ho provato a fare una dll seguendo quello che ho trovato in rete ma da errore perchè non riesce a trovare il punto d'ingresso. Ora mi studio quello che mi hai suggerito e vedo dove sbaglio.
Ti ringrazio per la spiegazione, ora ho le idee più chiare e so da dove posso iniziare, grazie!

Mantis-89
29-04-2009, 10:55
Credo di aver fatto qualche passo in avanti, ora non mi da più errori, anche se non funziona ancora come vorrei(adesso cerco di approfondire).

Se ci fossero altri interessati all'argomento segnalo anche questa pagina qui (http://www.dotnethell.it/articles/DLLVisualC.aspx).