Newsgroup: it.comp.lang.visual-basic
Titolo: [?] [Vb e DLL] Chiamata Dinamica in fase di run-time

Mi occorre chiamare una dll in fase di run-time (voglio fare il mio 
programma vb aggiornabile con plug-ins esterni contenuti in dll) Avevo fatto 
una cosa di simile in delphi dove in un file setup.dat (o se volete 
config.xml) erano indicate le dll aggiunte e con CallDLLByName (procedure, 
numero di argomenti , dimensioni in byte, byte array), si può chiamare una 
procedura.
In vb dovrei usare le API, cerco su MSDN e trovo che si carica la DLL con 
LoadLibrary, ottengo l'indirizzo della funzione con GetProcAddress e poi 
dovrei chiamarla,
c'è qualcosa del tipo ChiamaFunzione(Indirizzo)? Ovviamente nelle api non cè 
perché non dovrebbe essere un problema. Ma non mi voglio arrendere all'idea 
di dover fare una DLL in delphi per chiamare da VB altre DLL... che pizza.
Se potete aiutarmi grazie 

 ha scritto nel messaggio 
news:430cdb2f$0$8476$5fc...@news.tiscali.it...


Deserti Riccardo wrote:

Mi sembra ovvio che tu stia parlando di DLL ActiveX dato che vorresti fare 
tutto in VB (almeno così ho capito).
(piccola parentesi: e' vero che con VB si possono anche realizzare DLL 
"classiche" da invocare tramite DECLARE, ma non credo sia questo il 
caso...)
Pertanto, il tuo obiettivo è più semplice da raggiungere di quanto tu 
possa credere!
Infatti, come ti è già stato detto, una DLL ActiveX può essere facilmente 
istanziata tramite il late binding utilizzando l'istruzione CreateObject
Esempio:
'IPlugIn è l'interfaccia "comune" che tutte le tue DLL ActiveX dovranno 
implementare
dim MyPlugIn As IPlugIn
'NomeDLL e NomeClasse è il ProgID della DLL ActiveX che, come tutte le DLL 
ActiveX deve essere preventivamente registrata nel sistema
Set MyPlugIn = CreateObject("NomeDLL.NomeClasse")
'Invoco il metodo "DoSomenthing" definito nell'interfaccia IPlugIn ed 
implementato nella DLL specifica che si sta istanziando e che, a secondo 
della specializzazione appunto del singolo plug-in, visualizzerà un form, 
anziche invocare una stampa oppure inviare un'email...
MyPlugIn.DoSomenthing
Un esempio un pochino più concreto, giusto per dare un'idea:
Dim myPlugInModuloFattura as IPlugIn
Dim myPlugInModuloDDT as IPlugIn
On error resume next
Set myPlugInModuloFattura = CreateObject("PlugInFattura.PlugIn")
If err.number <>0 then
    'plugin fattura inesistente
    '...
    '...
end if
Set myPlugInModuloDDT = CreateObject("PlugInDDT.PlugIn")
If err.number <>0 then
    'plugin DDT inesistente
    '...
    '...
end if
'In caso di oggetti creati correttamente...
Sub MostraModuloFattura(x,y,z)
    'codice per la preparazione dei parametri
    '...
    myPlugInModuloFattura.ParametriStartUp(aParametri)
    myPlugInModuloFattura.AvviaPlugIn
End Sub
Sub MostraModuloDDY(x,y,z)
    'codice per la preparazione dei parametri
    '...
    myPlugInModuloDDT.ParametriStartUp(aParametri)
    myPlugInModuloDDT.AvviaPlugIn
End Sub
In pratica, entrambe i PlugIn (Fattura e DDT) implementano i metodi 
'ParametriStartUp' e 'AvviaPlugIn' definiti dell'interfaccia IPlugIn.
Il metodo 'ParametriStartUp' accetta un array di Variant (a volte, possono 
essere utili i variant...) in modo da poter accettare un numero variabile 
(in quantità e tipo) di valori di inizializzazione del plugin stesso.
Il metodo 'AvviaPlugIn', invece, è il metodo che "lancia" effettivamente 
l'esecuzione del plugin (visualizzazione di un form, anzichè anteprima di 
un report)
Insomma, nonostante siano appena le 7.00 del mattino (sono ancora in 
treno, diretto a Firenze...), credo di averti dato una traccia da seguire.
Ciao
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca

 tutto in VB (almeno così ho capito).
Prima di tutto ringrazio tutti per i preziosi suggerimenti, beh pensa che tu 
lo scrivi alle 7:00 io sono al lavoro dalle 0:00 e lo leggo alle 21:00 
quando mi sveglio dopo aver dormito per poi tornare al lavoro alle 0:00 
(facciamo tutti una vita meravigliosa :-) )
La modularità delle DLL ActiveX mi risulta preziosa ma purtroppo con un 
altro progetto.
Le DLL di cui sopra integrano il mio programma (il cui cuore è già 
interamente scritto in VB) ma non so chi le scriverà e con che linguaggio. 
Posso solo imporre il loro nome e il modo con cui devono essere chiamate. 
Per questo occorrono delle normali DLL __stdcall. Faccio un esempio. Metti 
che qualcuno per questo mio programma sviluppi un plugin per esportare i 
dati che questo programma tratta...
Io gli impongo di creare una DLL che contenga tre routine GetExporterInfo 
(Version, Title) ExportList(nomefile) e ImportList(nomefile)
Gli impongo durante l'installazione del plug-in di registrarsi in una lista 
(o parso la cartella dei miei plug in, e provo a chiamare la GetExporterInfo 
o una GetInfo fatta apposta per tutte... in qualche maniera vedo quali DLL 
ci sono e carico i miei plug-ins)
Il mio problema è "chiamare" una routine di una DLL di cui conosco il 
nomefile e il nome procedura/funzione.
per cui la carico con LoadLibrary
ottento il puntatore alla funzione con GetProcAddress (o Getprocedureaddress 
non mi ricordo)
e fin qui tutto ok
poi però la devo chiamare.....
Ma in VB non puoi fare
DIM MiaFunc as Function
MiaFunc = GetProcAddress("Questa procedura")
Per cui non so come chiamarla
(n.b.: la sintassi delle funzioni LoadLibrary e GetProcAddress è in questo 
messaggio inventata, fare riferimento ad WINAPI.TXT per la sintassi 
corretta, le ho qui inserite a *quasi* memoria al solo scopo 
esemplificativo)
Se è possibile Ringrazio della risposta
Se non è possibile Rigrazio del tempo che avete perso con questo thread...
Insomma grazie :-)
Riccardo