Newsgroup: it.comp.lang.c++
Titolo: dubbio su DLL

> 
http://www.geocities.com/sunsetstrip/stage/7787
 <<
<<<<<<<<<<<< 
DucaCr...@iol.it
 >>>>>>>>>>>>>>

Se apri il dialogo Settings e scegli la scheda Link, trovi, tra le altre
cose, un elenco di file .lib; aggiungi hook.lib.
Se ho letto bene la documentazione, in alternativa, dovresti poter scrivere
nel tuo codice una riga di questo genere:
#pragma comment(lib, "hook")
Non l'ho mai provata, magari fammi sapere se funziona.
Naturalmente devi anche importare le funzioni. Puoi usare ad esempio
__declspec(dllimport) e occhio alle eventuali decorazioni dei nomi. Ad
esempio:
__declspec(dllimport) ... fx1(...);
__declspec(dllimport) ... fx2(...);
__declspec(dllimport) ... fx3(...);
In alternativa puoi scrivere un file header di questo genere:
extern "C" __declspec(dllexport) ... fx1(...);
extern "C" __declspec(dllexport) ... fx2(...);
extern "C" __declspec(dllexport) ... fx3(...);
e includerlo sia nel progetto della DLL (in cui devi definire le funzioni
nello stesso modo) che in quello dell'applicazione client. Questo è il
metodo proposto nel Petzold.
Il file .DLL deve sempre essere presente perché è quello che contiene il
codice eseguibile vero e proprio. Il file .LIB, invece, non è più
necessario dopo la compilazione, tuttavia è meglio non eliminarlo, perché
se dovessi rilinkare l'applicazione, dovresti anche rilinkare la DLL per
rigenerarlo.
Stefano.

funzioni prese da una #include.
C'e` qui solo un poco di confusione...:
    #include e` solo un modo di portare "nel tuo sorgente" (dal punto di
        vista del compilatore vero e proprio) delle dichiarazioni (se vuoi,
        anche altre cose, ma e` meglio limitarsi alle dichiarazioni).
Da un file "di header" visto con #include NON vengono "prese delle
funzioni": solo le DICHIARAZIONI delle funzioni stesse.  E` _esattamente_
come se le dichiarazioni fossero direttamente nel tuo codice; usare
il #include e` meglio solo perche` riduce i rischi di dare dichiarazioni
_sbagliate_, cioe` diverse in due diversi casi per la stessa funzione.
Le funzioni vengono "prese" da file intermedi compilati: .OBJ o .LIB.
Come tu stesso hai detto, costruendo la .DLL hai prodotto anche,
come effetto collaterale, un .LIB; da esso, il linker puo` "prendere"
le funzioni nel senso di _riferimenti_ a quello che poi in realta` viene
esportato dal .DLL.
Per dire al linker di "prendere" le funzioni in questione, dunque,
basta aggiungere il .LIB al tuo progetto, o fra le librerie di input
nelle opzioni di link del progetto stesso.
Per DICHIARARE al compilatore (che gira PRIMA del linker)
l'esistenza e l'esatta forma delle funzioni, puoi fare #include di
un file .h che le dichiari (ma devi scriverlo!), oppure anche fare
direttamente le dichiarazioni nei tuoi sorgenti.
Quindi, TRE passi successivi:
-- a tempo di COMPILAZIONE del codice-cliente, accertati
    che siano visibili le DICHIARAZIONI delle funzioni che
    vuoi chiamare (con #include, o senza #include, vedi tu);
-- a tempo di LINK del modulo cliente, accertati che il linker
    usi la hook.lib a suo tempo prodotta (mettendola nel
    progetto, o nelle opzioni di link, vedi tu);
-- a tempo di ESECUZIONE del modulo cliente, e` meglio
    che la DLL sia nello stesso directory dell'EXE (cosi` vai
    tranquillo), ma puoi anche scegliere di tenerla in un
    qualsiasi directory della PATH, o c:\WINDOWS\SYSTEM
    (prassi poco consigliabili per altri versi, comunque molti
    oggi lo fanno).
Spero di non confonderti le idee con un'ulteriore nota: SE
la tua DLL esportasse le sue funzionalita` come interfacce
COM, descritte in una type-library (tipicamente inclusa come
risorsa nella DLL stessa) allora si` che il VC++ ti offrirebbe
una estensione non-standard per accedervi -- e` la istruzione
"#import".  Ma il #import NON si applica a DLL "qualsiasi",
solo a quelle che scelgono di implementare serventi COM
(ovvero, scelgono di esportare le proprie funzionalita` come
interfacce COM).  COM ha tanti vantaggi, ma richiede in
ogni caso una impostazione complessiva piuttosto diversa,
e non credo che tu voglia iniziare a studiarlo adesso.
Alex

metodo proposto nel Petzold.
Bel metodo, bravo Petzold! ;-))))
In quale libro di Petzold?.... (so che questi titoli vengono postati e
ripostati sul ng, ma abbiate pazienza.....;-))
Grazie mille a Stefano e ad Alex
;-)
