Newsgroup: it.comp.programmare.win32
Titolo: DLL che importa funzioni dal chiamante

Sembra che Luglio sia il mese delle DLL !
Mi hanno imposto di dividere un mio progetto (in VC++ non MFC) in
"programma base" che si interfaccia con un particolare hardware, e
"plug-in". I plug-in sono funzioni gia' scritte che sto trasformano in
DLL. I futuri clienti riceveranno il programma base e n plug-in a loro
scelta.
Il mio dubbio e' come importare le funzioni dal programma base.
Occorre sapere che: tutto il progetto e' ancora in sviluppo, e
probabilmente progredira' in continuazione seguendo gli aggiornamenti
dell'hardware. Questo mi impedisce di sapere in anticipo quali saranno
tutte le funzione del programma base che i plug-in utilizzeranno.
Quindi cosa esporto dal programma base? Tutto quanto?
Non e' concepibile allegare un update del programma base per ogni
nuovo plug-in comprato dal cliente. (Voglio dire: e' concepibile, ma
crolla l'utilita' dell'idea di plug-in).
Ho anche problemi dalle DLL a importare le funzioni del chiamante. Non
potendo linkare le .lib delle DLL al chiamante le carico con la
LoadLibrary. Idem per le DLL che usano una
LoadLibrary ("ProgChiamante.exe");
per importare funzioni.
Sto facendo giusto? Sono totalmente fuori strada? C'e' un metodo piu'
semplice?
Grazie in anticipo.
Paolo
PS: Ora e sempre: VIVA LA FERRARI !
Eravamo li, a Maranello, nella galleria del vento, a simulare il
giusto grado di cottura dei ciccioli, che all'improvviso Luca Cordero
di Montezemolo...

 - Sito Web

credo che l'idea di driver calzi al pennello.
Non e' esatto. Io intendevo plug-in come "estensioni" del software,
come ad esempio i filtri per effetti grafici che si aggiungono a
Photoshop, il programma base mette a disposizione l'immagine (in
pratica un puntatore alla bitmap e le info sul formato), il plug-in
elabora l'immagine.
Per ritornare al mio problema mi chiedo come fa una DLL (plug-in) a
prendere gli indirizzi dei dati e funzioni del chiamante.
Paolo

 Quindi cosa esporto dal programma base? Tutto quanto?
Tutte le API che possono servire ai plug-in attuali. Se scrivi nuove
funzioni i plug-in vecchi continueranno a funzionare, ma quelli nuovi
potranno servirsi anche delle nuove.
Nel caso qualche funzione/struttura dovesse cambiare in futuro, ti consiglio
di aggiungere un campo Version da qualche parte in modo che il prog. base
eventualmente sappia di dover emulare una vecchia funzione quando si collega
a vecchi plug-in.
Kiuhnm

Kiuhnm
Ciao
Paolo

 La dimensione della struttura dei dati che DLL e prg base si passano.
Come Windows?
Però non è detto che versioni diverse abbiano per forza dimensioni diverse.
In questo modo per distinguere versioni diverse potresti trovarti ad
aggiungere campi fittizi soltanto per modificarne la dimensione.
Kiuhnm

 prendere gli indirizzi dei dati e funzioni del chiamante.
Semplice, basta passare un puntatore al tuo plug-in tramite una funzione che
definisci in tutti i plug-in dello stesso tipo. Prendi Photoshop: tutti i
plugin avranno una funzione con lo stesso nome a cui Photoshop stesso
invierà il puntatore del blocco di memoria che contiene l'immagine con le
eventuali dimensioni e altre cose. Che bisogno ha il plugin di chiamare
funzioni del software base? E, nel caso abbia questa necessità, puoi sempre
passare il puntatore alle funzioni che ti permette di chiamare anche
funzioni private che non sono state definite con dllexport.
Forse stiamo facendo un po' di casino, cmq un po' di esperienza con roba di
plug-in ce l'ho, avendo programmato un emulatore dei plug-in per Winamp che
funziona niente male. Se ti può essere utile posso mandarti il codice in C
per chiarire un po' le idee in merito.


Kiuhnm
Paolo

Ciao!
Ciao
Paolo

 diversi messaggi di sistema sono comuni. Come mi oriento?
Intanto io proverei cosě...
Kiuhnm

 di "dimenticarsi" di esportare qualche funzione.
fa maluccio la testa? la scrittura di un programma si articola in una 
serie di fasi:
 - analisi dei requisiti e stesura della specifica. Cosa deve fare il
   tuo programma? cosa non deve fare? a che utenza è rivolto? su che
   piattaforma deve girare? ha senso scrivere il tuo programma, o puoi
   riciclare codice altrui? Fatti queste domande, risponditi, e scrivi
   le risposte così non rischi di dimenticarle
 - progettazione. Individuare i componenti del programma e le loro
   interazioni. Nel tuo caso, dovrai avere una o più classi astratte
   (interfacce) implementate dal tuo programma, e decidere quali
   esportare per farle implementare differentemente dai plugin, o quali
   riservare a cose che il tuo programma non fa del tutto e richiedono
   plugin. Il meccanismo con cui vengono implementati i plugin è, al
   momento, irrilevante. Preoccupatene quando saprai almeno cosa devono
   fare
 - programmazione
 - testing. Prendi un po' di tempo per scriverti un programma per
   testare i plugin
(non saltare le prime due, non conviene mai. Ti sembra di aver fatto un 
sacco di progressi, e poi intravvedi il muro di mattoni all'orizzonte)
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!

serie di fasi: [...]
Teoria, teoria, teoria...
Ciao
Paolo

 sapere a priori cosa mi servira' domani.
ottimo. Ti faccio tanti auguri


 Teoria, teoria, teoria...
Gia', che diventa Pratica, pratica, pratica...
--------------------------------
Inviato via 
http://usenet.libero.it

in formato testuale.
Infatti passo una struttura che contiene gli indirizzi dei dati piu'
importanti. Il programma base riceve a sua volta una struttura che
contiene la lista delle funzioni del plugin e come visualizzare le
chiamate nelle voci di menu.
Ripeto che il problema e' nell'immaginare tutte le possibili
problematiche che si possono venire a creare, come ad esempio
l'interazione fra due plugin.
Comunque ringrazio tutti. L'importante e' usare il NG con discrezione,
come ospiti e non come proprietari.
Ciao
Paolo

 non fossi ancora li a pensare...
Le persone non sono tenute a conoscere i tuoi tempi.
Oltre al fatto che puoi far sempre tesoro dei consigli degli altri e
sfruttarli per la prossima esperienza.
