Utilizzo dll

venerdì 04 maggio 2012 - 12.35
Tag Elenco Tags  VB.NET

pedro8a Profilo | Junior Member

Con vb.net per utilizzare una dll (ad esempio un secondo progetto), basta metterlo nei riferimenti.
Si può fare la stessa cosa con vb6?
Oppure bisogna registrare la dll/ocx?

Grazie

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

Dai un'occhiata qui vedi se può servire

http://www.ex-designz.net/apidetail.asp?api_id=617
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

non ci ho capito molto
serve per fare il load della dll all'interno del progetto?

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

dovrebbe permettere di tenere le Dll nelle directory desiderate e caricarle a runtime...
Non volevi fare questo?
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

esattamente questo, ci provo e ti faccio sapere... grazie

________________________
Pedro8a
Sviluppo per passione

pedro8a Profilo | Junior Member

stò cercando di utilizzare il codice che mi hai consigliato e:

Dim lib As String
'la mia libreria
lib = App.Path & "\dll.dll"
'LoadLibrary (lib)

Dim lb As Long, pa As Long
lb = LoadLibrary(lib)
'la libreria ha una funzione pubblica startFrm che apre un form frmprova
pa = GetProcAddress(lb, "startFrm")

'E ADESSO??? COME FACCIO??
'Call the SetWindowTextA-function
CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
'unmap the library's address
FreeLibrary lb

Grazie

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

Quale problema hai?
Come richiamare la funzione oppure la richiami e non esegue nulla?
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

come richiamare la funzione pubblica?
scrivo: CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&

ma non succede nulla

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

se ti va' (e se puoi) allega il progetto così facciamo prima
comunque credo tu non debba usare callwinproc ma la keyword Call


Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

ok, allegato i 2 progetti, la dll e il prog. principale

grazie

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

niente, così non si va' da nessuna parte... il codice che ti ho consigliato non ti permette di fare quello che vuoi...
Non riesco a trovare un metodo per far capire il punto di ingresso delle funzioni...

> (update1) qui il perché
The Declare statement does not work for VB DLL's, which are COM-dll's. They work for the Windows API DLL files (and others). They are written in C/C++ and functions therein are 'exported' so that other applications can use them. In VB it's only possible to write COM DLL's, which means that you always need to work with classes.
What you want to do is add a Class, call it something like Globals, and set it's Instancing to Global Multi-use. Then add a reference to the DLL in your other project and then you can use your function Test without having to use Declare.

> (update2)
Mi spiace per il tempo perso...

> (update3)
in pratica dovresti scrivere le dll in C affinché tutto funzioni come vuoi (in vb6)
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

va be, ci ho provato.
Ho un vecchio progetto vb6 da aggiornare e volevo fare delle dll esterne, evitando ogni volta di registrarle.
Potrei fare una procedura che in ingresso registra tutte le dll presenti?
Oppure registrare solo quelle modificate?

Ho provato la stessa cosa in vb.net e mi sembra tutta un altra musica.
Basta mettere la dll nella stessa cartella e la posso aggiornare quando voglio, vero?

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

>va be, ci ho provato.
>Ho un vecchio progetto vb6 da aggiornare e volevo fare delle
>dll esterne, evitando ogni volta di registrarle.ù
purtroppo no perché vb6 usa COM per gestire dll esterne (tranne le api di windows che riesce ad usarle con declare function)

>Potrei fare una procedura che in ingresso registra tutte le dll
>presenti?
>Oppure registrare solo quelle modificate?
dipende dalle dll... credo che anche in vb.net trovi lo stesso problema se vuoi usare una dll scritta in vb6 a meno di non usare le classi Interop

>
>Ho provato la stessa cosa in vb.net e mi sembra tutta un altra
>musica.
>Basta mettere la dll nella stessa cartella e la posso aggiornare
>quando voglio, vero?
si se fai link dinamico dovrebbe funzionare così... però le dll devi scrivere in uno dei linguaggi .net
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

Con vb.net farei tutto, programma principale e dll.
Ho fatto dei test e mi sembra funzioni correttamente.
Sulla macchina test ci metto le dll aggiornate/modificate e tutto funziona.
Pensi avrò problemi lavorando così?

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

No se lavori in ambiente .NET non hai nessun tipo di problema poiché è stato sviluppato apposta per essere interoperabile. (puoi tranquillamente scrivere le dll in c# e usarle in vb e viceversa)

Per quanto riguarda i caricamenti a runtime in ambiente .net abbiamo affrontato il problema in un altro post... però non ricordo bene il titolo e quindi dovresti cercare un po' indietro. (forse cercando Luca, Gestionale, Interfacce) dovresti beccarlo


Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

in realtà non ho carica nulla, ho soltanto impostato i riferimenti alla dll.
Mi piacerebbe mettere a disposizione il progetto e capire se stòandando nella direzione giusta.
Avrei da chiedere altre cose, come per esempio: come faccio a dichiarare variabile pubbliche sia per il progetto principale sia per le dll??

Grazie

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

per fare cose del genere devi iniziare a scomodare interfacce, stub etc ...
(ad esempio la variabile pubblica non la usi più come Public nomeVar as .... bensì tramite shared-memory o ste cose così....)

magari metti su il progetto e facciamo una cosa alla volta
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

Ciao Luigi,
il progetto è fatto in vb6 e non .net
Vuoi vedere cosa voglio fare?

Comunque ho fatto qualche prova in .net
Sinceramente non ho il bisogno di variabili globali a livello di progetto.
Mi spiego, se devo passare un valore ad un form di una dll faccio così:

nel fom (es.: Form1) della dll dichiaro una variabile pubblica (es.: Public IDva as Integer)

quando chiamo il fom della dll

dim form1 as new nome dll.Form1
form1.IDva=10
form1.shodialog

Mi sembra che già soddisfi le mie esigenze, posso passargli di tutto, dataset, array, ecc...

Che ne pensi?
Con .NET sono sulla "cattiva" strada.

E in vb6?

Ciao

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

>quando chiamo il fom della dll
>
>dim form1 as new nome dll.Form1
>form1.IDva=10
>form1.shodialog
Sei sulla cattiva strada in qualsiasi linguaggio se fai così... non incapsuli niente e corri il rischio di race-condition


>
>Mi sembra che già soddisfi le mie esigenze, posso passargli di
>tutto, dataset, array, ecc...
>
>Che ne pensi?
fai una cosa... metti le variabili private poi ti crei un metodo e gli passi i riferimenti ai dati che vuoi passare al form

private idv as string
public sub registerHandler(byref V as value)
synlock idv
idv = v
end synlock
end sub


poi quando devi richiamare fai

dim x as new dll.form1
x.registerHandler("valore_da_passare")

e inizi ad usare il tutto... almeno ti progetti da problemi



Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

Ciao Luigi,
cosa è synlock?

In quetso modo sono a posto?
L'unioca cosa da fare è mettere le dll nella stessa cartella del progetto exe.
Così facile?

Ho trovato un progetto che tratta proprio questo argomento e mi pare sia molto più complesso.
Se vuoi ti dico dove l'ho preso.

Ciao

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

>Ciao Luigi,
>cosa è synlock?
è il gestore dei lock (della concorrenza) usato in vb.net
Tieni persente che stai scrivendo una DLL che dunque può essere caricata da più eseguibili a runtime... e se due eseguibili a runtime invocano le stesse funzioni potrebbero capitare delle race-condition


>
>In quetso modo sono a posto?
>L'unioca cosa da fare è mettere le dll nella stessa cartella
>del progetto exe.

no scusami parlavo del modo in cui passavi gli argomenti al form nella dll :)
poi mi son perso cosa vuoi fare oltre a questo...

per gestire le dll hai diversi modi... il più semplice e metterle nella cartella dell'eseguibile

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

Quello che voglio fare è:
1- non avere un unico eseguibile per tutta l'applicazione
2- poter lavorare su moduli diversi su diversi pc

mi piacerebbe all'avvio dell'applicazione controllare che i moduli/ddl indispensabili siano preseneti, o lo fa già il .NET?

Puoi consigliarmi altro?

Grazie

________________________
Pedro8a
Sviluppo per passione

luigidibiasi Profilo | Guru

>Quello che voglio fare è:
>1- non avere un unico eseguibile per tutta l'applicazione
ok quindi va bene l'utilizzo standard delle dll... ti consiglio di dare un'occhiata anche alle interfacce in modo tale che vai a progettartele ben benino
scrissi un post sul blog diverso tempo fa'... mi autoreferenzio
http://blogs.dotnethell.it/luigidibiasi/Interface-e-Caricamento-a-runtime-DLL-di-implementazione__17014.aspx

in quel post scrissi queste parole
>Alla fine del post vogliamo avere a disposizione un metodo per:
> * Definire un file che conterrà solo la descrizione delle funzionalità
> * Definire diverse implementazioni della stessa funzionalità!
> * Caricare a runtime una delle implementazioni, a scelta, senza linkare direttamente le DLL al progetto.
di cui la terza riga credo sia il tuo problema


>2- poter lavorare su moduli diversi su diversi pc
>
quindi siete un team di sviluppo e ognuno deve scrivere un modulo?

>mi piacerebbe all'avvio dell'applicazione controllare che i moduli/ddl
>indispensabili siano preseneti, o lo fa già il .NET?
dipende dal tipo di link alla dll che vuoi fare... se statico (SI ci pensa .NET) o dinamico (NO parte del lavoro lo fai tu)
>


>________________________
>Pedro8a
>Sviluppo per passione
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

pedro8a Profilo | Junior Member

>>Quello che voglio fare è:
>>1- non avere un unico eseguibile per tutta l'applicazione
>ok quindi va bene l'utilizzo standard delle dll... ti consiglio
>di dare un'occhiata anche alle interfacce in modo tale che vai
>a progettartele ben benino
>scrissi un post sul blog diverso tempo fa'... mi autoreferenzio
>http://blogs.dotnethell.it/luigidibiasi/Interface-e-Caricamento-a-runtime-DLL-di-implementazione__17014.aspx

ho visto i tuoi post, li leggerò con molta attenzione, grazie mille

>
>in quel post scrissi queste parole
>>Alla fine del post vogliamo avere a disposizione un metodo per:
>> * Definire un file che conterrà solo la descrizione delle funzionalità
>> * Definire diverse implementazioni della stessa funzionalità!
>> * Caricare a runtime una delle implementazioni, a scelta, senza linkare direttamente le DLL al progetto.
>di cui la terza riga credo sia il tuo problema

Informazioni utilissime, ne farò tesoro.
Quando sui forum si incontrano persone come te, si impara molto. Grazie

>
>
>>2- poter lavorare su moduli diversi su diversi pc
>>
>quindi siete un team di sviluppo e ognuno deve scrivere un modulo?

Magari, sono uno sviluppatore/smanettatore e mi considero alle prime armi, come puoi vedere dalle domande che faccio.
Ma mi piacerebbe crescere e chissà diventare sviluppatore per professione.
Cerco di pensare in grande e di prevenire i problemi.
E secondo me avere un applicazione che cresce in un unico eseguibile non è molto corretto.

>
>>mi piacerebbe all'avvio dell'applicazione controllare che i moduli/ddl
>>indispensabili siano preseneti, o lo fa già il .NET?
>dipende dal tipo di link alla dll che vuoi fare... se statico
>(SI ci pensa .NET) o dinamico (NO parte del lavoro lo fai tu)

Statico vuol dire semplicemente che metto il riferimento alla dll?
Dinamico perchè carico la dll a runtime?

>>
>
>
>>________________________
>>Pedro8a
>>Sviluppo per passione
>Luigi Di Biasi
>
>
>http://www.dibiasi.it/
>http://netsell.dibiasi.it - ecomm software -
>http://blogs.dotnethell.it/luigidibiasi/
>http://yadamp.unisa.it/ - YADAMP CMS -


________________________
Pedro8a
Sviluppo per passione
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5