Newsgroup: it.comp.programmare.win32
Titolo: Caricare le DLL solo quando richiesto

Sto sviluppando un programma che dovra' essere eseguito in una rete con
computer Windows95, 98, NT e XP. Il programma ha le stesse funzionalita' su
tutti i pc, a parte alcuni che avranno in piu' la funzionalita' di
collegarsi ai dati ODBC utilizzando la dll odbc32.dll, che sui 95 e 98 non
e' presente. Il mio problema e' che linkando la libreria odbc32.lib quando
eseguo il programma sui 95 e 98 si blocca (prima di mostrare la prima
finestra del programma) dicendo che non trova il file odbc32.dll.
Esiste un modo per superare questo problema, visto che i 95 e 98 non hanno
bisogno di richiamere le funzioni odbc ?

 wrote in message
news:DubUa.14264$Df5.3...@news1.tin.it...

non la linkare, caricala dinamicamente con LoadLibrary (però ti tocca
dichiararti e assegnare i ptr alle
funzioni esportate dalla libreria) o tenere 2 copie distinte

Le funzioni per gestire gli odbc sono decine e molto complicate. Se
possibile vorrei evitare di seguire la strada con LoadLibrary().
Con tenere due copie distinte intendi due copie del mio programma, uno con
gli odbc linkati e uno senza ? questa strada mi crea troppi problemi perche'
il programma viene continuamente aggiornato.
Non esistono dei settaggi per includere staticamente le dll nel .exe un po'
come si fa per le librerie RTL del C ? oppure la possibilita' di far
accedere i pc client alle dll registrate sul pc server ?
Come ultima opzione, se queste librerie odbc sono scaricabili direttamente
dal sito Microsoft, le installerei su tutti i client. Ora faccio una
ricerca, magari se lo sai indicami i link dove le posso trovare.
Grazie.
"Antonio" <a[NOT]mazzeo@email[DOT].it> ha scritto nel messaggio
news:mTbUa.203284$Ny5.5...@twister2.libero.it...


 ricerca, magari se lo sai indicami i link dove le posso trovare.
credo che con gli mdac dovresti risolvere questo problema...
gli mdac li puoi scaricare dal sito ms tranquillamente
antonio


Credo proprio che l'unica strada da seguire. Unico dubbio: scaricando e
installando i vari mdac e dcom95 (necessario per Windows 95) si sono
presentate delle lunghissime licenze. Le ho lette solo in piccola parte e
credo che li possa installare senza problemi. Mi confermi che non violo
nessun copyright o cose simili ?
Grazie.

 LoadLibrary().
Una possibile idea, un po' contorta ma non troppo difficile da
realizzare, e` quella di inserire tutte le parti del tuo programma che
usano le funzioni delle DLL "incriminate" a loro volta in una tua DLL.
In questo modo dovrai chiamare LoadLibraryEx() e GetProcAddress() solo
per la tua DLL e per le poche funzioni di interfaccia che contiene,
mentre il caricamento di tutte le altre DLL sara` effettuato da Windows
nella maniera tradizionale quando caricherai la tua DLL.
Mi sono reso conto che la risposta e` incomprensibile, ma confido nelle
tue doti di interprete. :)
-- 
Lorenzo

 il programma viene continuamente aggiornato.
una define di pre processore in cui tagli via tutte le parti dove usi odbc
??? cosi' ottieni solo una doppia compilazione con o senza odbc e i due
eseguibili per la famiglia nt e per le famiglie vecchie ...
ciao

 ha scritto nel messaggio
news:bfs2uu$8h8$1...@news.ngi.it...


Puo' essere una buona idea, grazie.
"Lorenzo Lutti" <lorenz...@DOHtiscalinet.it> ha scritto nel messaggio
news:DgfUa.204106$lK4.5...@twister1.libero.it...


 non hanno bisogno di richiamere le funzioni odbc ?
si usa un trucco di linker: specifica il delay loading per odbc32.dll e 
il linker genererà da sè tutto il codice necessario a fare LoadLibrary, 
GetProcAddress e quant'altro. A runtime, per verificare se odbc32.dll è 
disponibile, controlla se una delle sue funzioni ha indirizzo NULL
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.2. C, C++ and ASM developers
                               and beta testers are welcome!

 ha scritto nel messaggio
news:Xns93D0B814...@127.0.0.1...


 automatico il linker....
molto probabilmente sta parlando di vc e sue impostazioni di link ... io con
il gcc non so che sia sto delay loading ...
ciao

 ... io con il gcc non so che sia sto delay loading ...
noto bug delle binutils. Pazienta un po'


 ne' cosa dovrebbe generare in automatico il linker....
dimentica quel che ho scritto e fai finta che avvenga per magia, tanto, 
alla fine, l'effetto è lo stesso


link [...] il gcc non so che sia sto delay loading ...
Infatti, meglio mantenersi su un livello generale e non specifico di un
compilatore.
In realtà, non è poi così noioso dichiarare una funzione in una DLL , per
esempio se vuoi accedere alla funzione Send contenuta nella blat.dll :
int _stdcall (*BlatSend) (char *);
(*(void**)&BlatSend=(void*)GetProcAddress(LoadLibrary("blat.dll"),"Send"))
L'Handle ritornato da LoadLibrary non è necessario a meno ché non si voglia
chiudere la libreria prima di uscire dal programma. Windows infatti libera
automaticamente le librerie aperte quando si chiude il programma.
--------------------------------
Inviato via 
http://usenet.libero.it

>Le funzioni per gestire gli odbc sono decine e molto >complicate. Se
possibile vorrei evitare di seguire la strada >con LoadLibrary().
Hai bisogno di una sola libreria ??
Be', la via migliore resta secondo me quella di caricarla dinamicamente con
LoadLibrary (vedi altro messaggio con esempio), altrimenti falla installare
dal programma di installazione (non è distribuibile ?) .
