Newsgroup: it.comp.lang.c++
Titolo: registrare una DLL

Volevo creare dei dischetti di distribuzione di un programma realizzato.
Il programma richiede il motore DAO, infatti usa database formato
Access.
Faticosamente ho scoperto la nota tecnica Microsoft Q167523
"Redistributing DAO with your Visual C++ application" reperibile
all'indirizzo:
http://support.microsoft.com/support/kb/articles/q167/5/23.asp
.
Tale nota è esauriente, il problema è che non sto capendo un tubo
riguardo alla registrazione o meno di alcune DLL che andrennero non solo
installate ma anche "registrate" (Es. Oleaut32.dll, DAO350.dll,
Msjet35.dll ecc.). Sto cercando di usare Install Shield, sono arrivato
al punto in cui mi installa tutte queste DLL nelle directory giuste, ma
probabilmente non le registra poichè nei computer che non ce le hanno il
mio programma non funziona (nel mio e nei computer con Office 97
installato funziona benissimo).
Tra l'altro un mio amico mi ha detto che Visual Basic "fa tutto lui".
Sono profondamente scoraggiato, depresso, incazzato e sinceramente
maledico il giorno in cui mi sono dedicato allo studio di questo
linguaggio (sono fermo su questo problema da una ventina di giorni).
faccio a questo punto le seguenti domande:
- è giusta la mia deduzione, cioè che il programma non funziona perchè
non ho registrato le DLL che andavano registrate ?
- come faccio a "registrare" queste DLL con Install Shield?
ultima domanda che dimostra che non sto capendo un tubo:
- a che cavolo serve questa fantomatica "registrazione"? Cioè: perchè
alcune DLL devono venire "registrate" ed altre no? Che significa? (mi
domando seriamente perchè per avere la soddisfazione di fare un
programmino e distribuirlo devo sapere tutte queste cose del sistema
operativo - tra l'altro se guardate la nota tecnica da me citata
occorrono ben 13 files per installare DAO sul computer, oltre ovviamente
i files del programma stesso - o sono scemo io o alla Microsoft stanno
impazzendo - è più probabile la prima soluzione).
Mi sento un emerito cretino, ho passato momenti difficili nello studio
del Visual C++ ma mai come questo.
Ho i seguenti testi sul Visual C++:
Robert Shaw & Dan Osier " Teach yourself MFC in 21 days"
J. Prosise - "Programmare Windows 95 con MFC"
David J.Kruglinski - "Inside Visual C++"
Peter Norton & Rob McGregor "Windows 95 Programming with MFC"
Marshall Brain & Lance Lovette "Developing Professional Application
using MFC"
Peter Hipson & Roger Jennings "Database Developers's Guide with Visual
C++ 4"
Mastering Microsoft Visual C++ 4.0
MFC SmartLabs
Forse sono esaurito......... fortuna che tra un po' vado in ferie.
Un saluto con simpatia al newsgoup.
                                                    Samuele Terziani
--
Automatic posted from root@[195.103.65.250]
via Mailgate Server - 
http://www.mailgate.org

Mi pare (a meno che non sia un caso di omonimia) che "Mastering Microsoft
Visual C++ 4.0" sia il testo consigliato per la preparazione ad alcuni
esami di certificazione Microsoft, quindi se cerchi bene dovrebbe esserci
una parte dedicata allo sviluppo di componenti, in cui dovrebbe essere ben
spiegata l'importanza della registrazione. Veniamo alle domande:
A che cosa serve la registrazione ?
L'espressione 'registrare una DLL' non è propriamente corretta; in realtà
sono i componenti in essa implementati che vengono registrati e, comunque,
non tutte del DLL implementano componenti . Registrare un componente
significa renderlo visibile ed utilizzabile da qualunque applicazione. Ogni
componente è univocamente identificato da un GUID. Quando si crea
un'istanza di un componente si deve specificare il suo GUID (in questo caso
prende il nome di CLSID) e non, ad esempio, il nome della DLL in cui è
implementato. Ma allora, come fa a sapere dove andarlo a cercare ? Durante
la registrazione, tutte le informazioni necessarie vengono memorizzate nel
Registro di configurazione di Windows. Carica l'editor del Registro,
espandi la chiave 'HKEY_CLASSES_ROOT', cerca la sottochiave 'CLSID' ed
espandila; troverai un elenco di CLSID. Ognuno di questi CLSID identifica
un componente installato nel tuo sistema. 
I primi dell'elenco dovrebbero essere proprio quelli degli oggetti DAO;
espandine uno, dovresti trovare due sottochiavi: InprocServer32 e ProgID.
Nella prima si trova tra l'altro l'ubicazione effettiva del componente e
nella seconda un nome che viene associato al CLSID; quest'ultima chiave non
è obbligatoria ma è decisamente consigliata (in effetti è più facile
ricordarsi DAO.DBEngine.35 piuttosto che il relativo CLSID di 128 bytes).
Ma come avviene questa associazione ? Se cerchi più in basso, sempre nella
chiave 'HKEY_CLASSES_ROOT' troverai un lunghissimo elenco di ProgID; quelli
appartenenti a DAO incominciano tutti con 'DAO.'. Espandine uno, leggi il
CLSID e cercalo nell'elenco dei CLSID, troverai le informazioni (relative
all'oggetto in questione) di cui ho parlato 
in precedenza. Esistono funzioni di utilità che, dato un ProgID,
restituiscono il CLSID associato.
Nota su InprocServer32: andando a curiosare sotto altri CLSID scoprirai
che, in alcuni di essi, questa sottochiave è sostituita da LocalServer32.
Questo significa che il componente è implementato in un file eseguibile di
tipo EXE e non in uno di tipo 'libreria a collegamento dinamico' (DLL, OCX,
ecc.). In questi casi, dato che un EXE non può essere mappato nello spazio
di indirizzamento di un altro processo, le chiamate devono essere gestite
in modo differente. 
Il programma non funziona perchè non ho registrato le DLL ?
Se non hai registrato i componenti, l'applicazione non funzionerà di
sicuro, a meno che non fossero già registrati in precedenza, ma non puoi
darlo per scontato.
Come registrare le DLL ?
Una DLL che implementa componenti di solito esporta  le seguenti 4 funzioni
(un file EXE invece dovrebbe supportare le opzioni di linea di comando
/REGSERVER e /UNREGSERVER):
DllRegisterServer
DllUnregisterServer
DllGetClassObject
DllCanUnloadNow
Le prime due funzioni hanno lo scopo di registrare il componente e di
annullarne la registrazione. Lo sviluppatore di componentistica dovrebbe
implementare queste funzioni in modo che registrino e deregistrino tutti i
componenti presenti nella DLL.
Registrare un componente è semplice, basta richiamare la funzione
DllRegisterServer. Questo può essere fatto direttamente dal programma
usando GetProcAddress, oppure usando l'utility 'regsvr32.exe'.
Premetto che non ho mai usato InstallShield, ma spulciando la
documentazione sembra che si debbano includere tutti i server di componenti
in un singolo gruppo a cui viene impostata a 'YES' la proprietà
'Self-Registered' e forse anche la proprietà 'Shared'. In questo modo pare
che venga chiamata automaticamente la funzione DllRegisterServer per ogni
file appartenente a questo gruppo. Se il file è un EXE dovrebbe essere
eseguito con l'opzione /REGSERVER.
Comunque, per maggiori dettagli, consulta la documentazione. Cerca
'Installing self-registering files'.
Stefano.