Newsgroup: it.comp.lang.vo-clipper
Titolo: Librerie e DLL

Ciao a tutti.
Una domanda che potrebbe sembrare strana e cioè:
Qual'è la differenza fra creare una DLL od una Libreria in termini di
velocità di esecuzione e dimensioni dell'eseguibile? (dato che la libreria
viene direttamente linkata con l'eseguibile) Quando usare l'una o l'altra?
    Io normalmente utilizzo DLL. (Interne, utilizzate come librerie). Grazie
per qualunque delucidazione.
Ciao a tutto il NewGroup. Enzo.

 Io normalmente utilizzo DLL. (Interne, utilizzate come librerie).
Non esistono le "DLL interne". :-)
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 ha scritto nel messaggio
news:YVIYb.251169$VW.10...@news3.tin.it...

Se hai una "applicazione" general pourpose (una DLL non è nient'altro che
una applicazione che non può funzionare da sola) che linki a tutte le tue
applicazioni ti conviene creare una DLL,così faciliti la manutenzione, così
come suddividere in DLL una grossa applicazione per facilitarne la
ridistribuzione.
Ti consiglio di creare DLL invece che lib, migliori anche la riusabilità del
codice.
Non vedo il vantaggio di usare una DLL come lib, hai tutti gli svantaggi
senza alcun vantaggio.
Danilo Giuliani
www.softdevo.com
in...@softdevo.com
sup...@softdevo.com

 ha scritto nel
messaggio news:40336928...@emagsoftware.it...


Eccolo...
CLASS myShellWindow INHERIT ShellWindow
  PROTECT aDLLS AS ARRAY
METHOD AddDLL( cDLLName ) CLASS myShellWindow
  // Carica una DLL -> Componente applicazione
  LOCAL hINST AS PTR
  LOCAL hFUNC AS PTR
// All'inizio devo creare un array vuoto
IF Empty( SELF:aDLLS )
  SELF:aDLLS := {}
ENDIF
// Carico la DLL secondo percorsi standard
hINST := _VOLoadLibrary( cDLLName )
IF hINST == NULL_PTR
  // In caso di errore visualizzo il codice errore standard di Windows per
capire cosa è successo
  // Per elenco codici errori vedi Win32SDK Help
  IF Msg( "Attenzione " + NTrim( GetLastError()), "File " + cDLLName + " non
trovato. Inizializzazione sistema fallita", MB_ICONERROR, MB_RETRYCANCEL,
0 ) == IDRETRY
    RETURN SELF:AddDLL( cDLLName )
  ELSE
    RETURN FALSE
  ENDIF
ENDIF
// Chiamo la funzione di entrata
// La funzione di entrata deve essere presente nella DLL
// altrimenti VO non vede le classi... Trucchetto :-)
hFUNC := GetProcAddress( hINST, String2Psz( "INITDLL" ))
IF hFUNC == NULL_PTR
  _VOFreeLibrary( hINST )
  Msg( "Attenzione", "Funzione di inizializzazione per la libreria " +
cDLLName + " non trovata (INITDLL). Inizializzazione sistema fallita",
MB_ICONERROR, MB_OK, 0 )
  RETURN FALSE
ENDIF
// Chiamo la funzione di entrata x far vedere il tutto a VO
PCALL( hFUNC )
AAdd( SELF:aDLLS, { hINST, cDLLName } )
RETURN TRUE
METHOD Destroy() CLASS MyShellWindow
  LOCAL I, dwLen AS DWORD
  dwLen := ALen( SELF:aDLLS )
  FOR I := 1 UPTO dwLen
    _VOFreeLibrary( SELF:aDLLS[I,1] )
    SELF:aDLLS[I,1] := NULL_PTR
  NEXT
RETURN SUPER:Destroy()
La funzione INITDLL deve essere contenuta nella DLL ed è:
FUNCTION INITDLL() AS LOGIC PASCAL
  RETURN TRUE
Ciao ciao

 scollegare in maniera dinamica una DLL?
Si usano le API LoadLibrary() (o LoadLibraryEx()) e FreeLibrary().


 Non esistono le "DLL interne". :-)
In effetti sono stato poco chiaro. Volevo dire che non ho creato le DLL ma i
file li ho linkate direttamente nell'eseguibile.
