Newsgroup: it.comp.programmare.win32
Titolo: DLL e Window Class

Raga, ho appena scritto la mia prima DLL e già ho dei problemi. Allora, la
mia DLL contiene 2 funzioni: una funz per registrare una window class e la
window procedure relativa. Per ora come HINSTANCE di registrazione della
classe utilizzo NULL ma mi piacerebbe utilizzare il valore esatto per
rendere la classe registrata solo all'interno dell' app che chiamano la mia
DLL (oppure sto sbagliando e le classi sono sempre globali?). Quindi la
domanda è: come faccio a ricavare l'HINSTANCE dell'exe che chiama la mia
DLL?
Un grazie grande così [<-      ->] a chi mi aiuterà.
Ciao, Giuseppe
P.S. Qualcuno mi darebbe una panoramica sull'utilizzo di dllimport e
dllexport? Please, tutti i tutorial sulle DLL non davano peso
all'importazione e all'esportazione delle funzioni.... :-(
---------------------------------------------------------------------------
_Guybrush su IRCNet canale #programmazione
ICQ: 42227764
---------------------------------------------------------------------------

 all'importazione e all'esportazione delle funzioni.... :-(
Non e` che ci sia molto da dire. Anziche` importare/esportare i simboli usando
il file .DEF, queste due parole chiave (fuori standard) ti permettono di farlo
direttamente nel sorgente. Diciamo che tu abbia questa funzione da esportare:
int LaTuaFunzione( int a, int b) { ...
Basta che aggiunga all'inizio __declspec(dllexport) all'inizio della sua
definizione:
__declspec(dllexport) int LaTuaFunzione( int a, int b) { ...
E il simbolo verra` esportato. L'importazione invece si fa nella dichiarazione
delle funzioni:
__declspec(dllimport) int LaTuaFunzione( int a, int b);
Da notare che i simboli esportati/importati con __declspec seguono il solito
"name mangling" del Visual C++, il che potrebbe rendere difficoltoso
l'interfacciamento con altri linguaggi. Ad esempio se LaTuaFunzione fosse
Pascal, il simbolo esportato sarebbe:
_LaTuaFunzione@4
Se poi compili tutto in C++ anziche` in C, il simbolo e` ancora piu` contorto.
Si puo` rimediare a tutto questo usando il caro, vecchio file DEF:
EXPORTS
    LaTuaFunzione
In questo modo avrai definito un alias implicito e il simbolo esportato sara`
effettivamente LaTuaFunzione. Ora pero` non potrai piu` importarlo con
__declspec(dllimport), che si "aspetta" il name mangling.
--
Bye! Lorenzo Lutti (
http://www.geocities.com/SiliconValley/Peaks/6258/
)

 __declspec(dllimport), che si "aspetta" il name mangling.
Grazie per l'avvertimento. In questo caso come dovrei importare la funzione?
Ciao, Giuseppe


Una chiamata a GetModuleHandle (con parametro NULL) dall'interno di una DLL,
non restituisce l'handle di istanza della DLL stessa, ma quello del processo
in cui la libreria è mappata in quel momento, che è proprio quello che
volevi.
Ciao,
Stefano

 wrote in message 7vm2p0$9jh$1...@nslave1.tin.it...

Grazie 1000, funziona!!! :-)
Avrei voglia di fustigarmi, se solo avessi guardato più attentamente l'help
in linea ci sarei arrivato da solo. A volte sono proprio @*ç#§° :-((
Grazie per l'aiuto


> Avrei voglia di fustigarmi...
Non č stata una tua disattenzione, quest'informazione non si trova nell'help
in linea di GetModuleHandle (al limite potrebbe essere sepolta in qualche
articolo Knowledge Base), ma su "Programmazione avanzata per Windows III
ed." di Jeffrey Richter, del quale sta per uscire una nuova edizione
aggiornata a NT 5.0, W98 e programmazione a 64 bit.
Questa volta mi sono ricordato di aggiungere la "e" nell'oggetto; non posto
molto spesso, e il piů delle volte me ne dimentico.
Stefano.

 molto spesso, e il piů delle volte me ne dimentico.
Da quando sono passato a IE5 il bug mi e ritornato e devo modificare anch'io
manualmente l'oggetto. Spero di non scordarmelo mai...


 Grazie per l'avvertimento. In questo caso come dovrei importare la funzione?
Una volta c'era la comodissima sezione IMPORTS nel DEF, ma malauguratamente la
Microsoft ha deciso di eliminare il supporto. Diverse cose piuttosto comode che
riguardano il dynamic linking sono state eliminate, non so bene per quale
motivo; ad esempio dai compilatori a 32 bit hanno smesso i fornire IMPLIB,
un'utility molto utility per creare un .LIB a partire dalla DLL.
Fortunatamente sulla rete se ne trovano delle versioni "casalinghe", che usano
l'output di DUMPBIN in modo creativo... ;-)
Divagazioni a parte, non conosco metodi per "convincere" il Visual C++ a
importare i simboli senza name mangling (a parte ovviamente il linking al volo
con GetProcAddress). Nemmeno extern "C" e` sufficiente. Pero` se devi scrivere
una DLL che si dovra` interfacciare con altri linguaggi (tipo il VB o Delphi)
e` piu` bello usare nomi "puliti".


 e` piu` bello usare nomi "puliti".
Certo, mica si puņ distribuire un DLL con funzioni esportate del tipo
CreateBug@12$ln, ActivateBug@16$qc o MurderBug@32$MS :-))


|Certo, mica si può distribuire un DLL con funzioni esportate del tipo
| CreateBug@12$ln, ActivateBug@16$qc o MurderBug@32$MS :-))
Sopratutto se sono così piene di bug!:-)
--
Ciao , Ricardo Antonio Piana
(Rico per gli amici)
ri...@kiss.to
ICQ #53211666
______________________________________________
Tutti i miei racconti , alcune poesie ed altro nel mio sito
http://kiss.to/rico
______________________________________________