Oppure

Loading
02/09/05 7:56
Chevantonio19
salve a tutti e complimenti per l ottimo sito. ho creato una dll con una funzione in vb, ma se richiamo la funzione in un altro progetto mi dice che nn trova la entry point della funzione. nn so da dove cominciare per risolvere il problema.:-|
aaa
03/09/05 21:22
Chevantonio19
ok il buon google mi ha aiutato e ho trovato un articolo che mi ha aiutato a risolvere il problema del linkaggio e ora sono riuscito a risolvere il problema della chiamata alla funzione.
ora pero' ? in vista un altro problema. diciamo che le variabili nn vanno come dico io. ad esempio in una funzione doppio(numero as long) as long , se do alla funzione come variabile numero ad esempio 8, nn mi restituisce 16 eseguendo numero + numero , ma 124873 o una cosa del genere.
sul documento che ho trovato si parla di una cosa del genere per le stringhe che vanno elaborate codificandole in unicode e decodificandole all interno della funzione nella dll, ma integer e long non so come manovrarli per fare operazioni normali :d
credo che confidero' ancora in google 8-| se qlk anima buona nn sapra' aiutarmi cmq se puo' servire metto in un articolo la procedura alla risoluzione del problema per cui ho aperto questo topic :k:
aaa
04/09/05 8:49
hedo
code plz...


aaa
06/09/05 9:10
Chevantonio19
quando viene prodotta una DLL 'normale', tutte le funzioni non esplicitamente esportate (con la direttiva dllexport nel codice, o analoga) che si vogliano rendere disponibili agli altri programmi, possono essere elencate in un file di testo apposito con estensione .def (definition file).
Per esportare tali funzioni quindi ? sufficiente indicare al linker il nome del file tramite lo switch

/DEF:nomefiledef

E questo basterebbe, ma bisogna farlo nella fase in cui l'IDE richiama il LINK al momento della creazione dell'eseguibile.

Per fare ci? si potrebbe agire con un addin che intervenga durante il processo di compilazione, ma questo ? un metodo piuttosto 'delicato' e inutilmente complesso per quello che si vuole ottenere.

Il metodo che propongo, invece, sfrutta il fatto che il programma LINK.EXE richiamato dall'IDE durante la compilazione ? presente nella cartella del VB, in cui ? presente anche il compilatore C2.
L'idea ? quindi sostituire questo eseguibile con un nostro eseguibile scritto in VB (!) chiamato LINK.EXE dopo aver rinominato il vecchio programma in LINK32.EXE (consiglio di copiare per sicurezza il file LINK.EXE originale in un'altra cartella di backup per evitare di "perderlo" per errore).
Avremo cos? nella cartella del VB due file

LINK.EXE - un eseguibile scritto in VB richiamato durante la fase di link di qualsiasi progetto
LINK32.EXE - l'eseguibile originale del linker richiamato dal nuovo programma LINK.EXE
Quando verr? richiamato il nuovo LINK, questo dovr? esaminare tutti i parametri passati nella linea di comando, riconoscere il fatto che si sta compilando una DLL in VB6 (tramite lo switch /DLL e la presenza del file di input VBAEXE6.LIB) ed aggiungervi lo switch /DEF con il nome del file di definizione avendo cura di controllare preventivamente la presenza di tale file.
Esaminando il codice del nuovo programma LINK.EXE, si potr? capire meglio:

'questo andra' scritto in un modulo

' File LINK.EXE
Public Sub Main()
Dim cmd As String
Dim fOut As Long
Dim sOut As String
Dim sDef As String


cmd = Command$
If InStr(cmd, "/DLL ";) > 0 And InStr(cmd, "VBAEXE6.LIB";) > 0 Then
fOut = InStr(cmd, "/OUT:";)
sOut = Mid(cmd, fOut + 6, InStr(cmd, "/BASE:";) - fOut - 8)
sDef = Left(sOut, Len(sOut) - 3) + "def"
If Len(Dir(sDef)) Then
cmd = cmd & " /DEF:""" & sDef & """"
End If
End If

Shell "LINK32.EXE " & cmd
End Sub

Tale programma ? costituito solamente da una breve procedura Main in un modulo che preleva il contenuto della linea di comando e la esamina. Se contiene lo switch /DLL e il file di input VBAEXE6.LIB, continua con l'esame della stringa in input altrimenti richiama semplicemente il vecchio LINK (adesso denominato LINK32) passandogli in modo trasparente la linea di comando originale. Ci? garantisce la "non interferenza" con le compilazioni 'normali'.

Se viene rilevata la compilazione di una DLL di VB6, allora viene creata una stringa con lo stesso nome del file presente nello switch /OUT ma con estensione .DEF. Se tale file esiste, viene aggiunto lo switch /DEF alla linea di comando e passato al vecchio LINK (LINK32). Ci? indicher? al vecchio LINK che esiste un file con un elenco di funzioni da esportare che saranno quelle che ci interessa rendere disponibili.

Quindi prima bisogna creare il file .def e poi compilare la dll.

Un esempio e il contenuto del file .DEF
Per completare, ecco un esempio, si suppone che il vecchio LINK.EXE presente nella cartella di VB (in genere, \Programmi\Microsoft Visual Studio\VB98) sia stato rinominato in LINK32.EXE e che il nuovo LINK.EXE sia stato copiato in tale cartella.

Una precisazione ? d'obbligo. Dato che l'IDE (VB6.EXE) effettua il primo passo della compilazione e controlla tutti gli switch passati al compilatore e al linker, ? necessario creare un progetto di tipo DLL, con un modulo di classe praticamente vuoto utilizzato solamente allo scopo di ingannare l'ambiente e fare in modo che predisponga i corretti switch per quella che comunque sar? una DLL. Ci? non vuol dire che dovremo registrare tale DLL (anche se le funzioni per la registrazione/deregistrazione saranno esportate e disponibili) e potremo usare solamente le funzioni esportate che ci saranno alla fine del processo.

L'esempio (MyDLL.vbp) ? un progetto costituito da un modulo di classe (CDummy.cls) completamente vuoto ed incluso solo per i motivi gi? esposti, e da un normale modulo (SymExp.bas) contenente le funzioni che si vogliono esportare. Nell'esempio che ho scritto queste sono due e precisamente:

Public Function AddTest(ByVal op1 As Long, ByVal op2 As Long) As Long
AddTest = op1 + op2
End Function

Public Function StrRevTest(ByVal s As String) As String
Dim r As String
r = StrConv(s, vbUnicode)
r = StrReverse(r)

StrRevTest = StrConv(r, vbFromUnicode)
End Function

e, in pi?, ? presente una funzione Main vuota

Private Sub Main()
End Sub

utilizzata solamente perch? il progetto impone tale presenza formale.

? importante anche notare, per quanto riguarda il passaggio delle stringhe, che esse devono essere convertite in ingresso/uscita rispetto al formato Unicode; a questo provvede la funzione StrConv (nei due sensi).

Come detto, ci? ? stato reso possibile dalla presenza del file .def che deve contenere l'elenco delle funzioni da esportare ma, a questo punto, ? necessaria una precisazione.
Dato che il compilatore (C2, il secondo passo) ? in effetti una variante di quello del C++, i simboli risultano 'decorati' secondo un preciso criterio e quindi ? necessario scrivere quanto segue nel file .def del nostro esempio (MyDll.def)

LIBRARY MyDLL
DESCRIPTION "MyDLL - (C) Antonio Giuliana, 2004"
EXPORTS
AddTest = ?AddTest@SymExp@@AAGXXZ
StrRevTest = ?StrRevTest@SymExp@@AAGXXZ

Mentre le prime due righe hanno un chiaro significato, la terza indica che inizia l'elenco delle funzioni esportate e che il nome delle funzioni all'interno del progetto in VB corrisponde a quello 'decorato' posto a lato del simbolo di eguaglianza.
In generale, il nome decorato ? composto da ?NomeFunzione@NomeModulo@@AAGXXZ (non chiedetemi cosa indichi AAGXXZ... ).

(Questo documento ? stato preso da visual-basic.it/articoli/…)

Insomma per recapitolare fate quel nuovo link.exe e rinominate quello vecchio link32.exe poi salvate il progetto della dll mettendo quel modulo di classe vuoto e nella cartella dove avete salvato il progetto e compilerete la dll scrivete quel file .def come scritto sopra e infine compilate.
per quanto riguarda le stringhe ve lo dice come utilizzarle ma le altre variabili ??? :d
Ultima modifica effettuata da Chevantonio19 06/09/05 9:13
aaa
06/09/05 16:03
hedo
hehe... Se noti bene, su quel sito ci sono ben 3 miei articoli :D:D:D Questo ? il grande Antonio Giuliana... in uno dei suoi articoli spettacolo!

Ciao!
aaa
06/09/05 22:21
Chevantonio19
azz sul sito nn ho visto niente giusto quell articolo che mi serviva al momento... chissa' se antonio ha scoperto anche come utilizzare le variabili...:-|
aaa
07/09/05 8:17
hedo
il 'nulla di giusto' lo terrei a posto... potrei offendermi. Dire pi? che altro 'non c'ho capito un cavolo'... cmq siamo qui per risolvere dei problemi no? allora risolviamoli: Il vb6 usa un tipo di dll che ? chiamato dll COM, in pratica ? come se si incorpoasse la dll all'interno del progetto, quindi ? a tutti gli effetti un ActiveX... Quello che vuoi fare te ? inutile e serve solo a complicarsi la vita, quindi, se vuoi far funzionare il prog, crea una nuova dll dal vb6 e mettici un modulo con dentro la tua funzione e specifica il tipo di esportazione, se non vado errato ? GlobalNonCreatable o qualcosa del genere. Metti nel modulo la tua funzione, compili la dll e poi molto semplicemente da qualsiasi altro progetto vb6 la aggiungi a riferimenti e magicamente la vedrai apparire nel Visualizzatore Oggetti wowow!!!

Ciao!
aaa
07/09/05 10:16
Chevantonio19
eheheh hai capito male
nn oserei mai dire che nn c'era niente di giusto nei tuoi articoli.
ho detto che non ho visto niente nel sito.
GIUSTO (nel senso di SOLAMENTE :rotfl:) quell' articolo di antonio che mi ? servito tantissimo ;)
spero che tu capisca il senso della mia frase siamo qui per risolvere problemi come hai detto tu nn certo per criticare il lavoro altrui
:(
cmq il tuo consiglio nn fa una grinza ma se io volessi usare la dll in programmi c++??? se riuscissi a gestire le variabili potrei avere un maggiore utilizzo delle dll in ogni tipo di linguaggio . come dici tu, sarebbero limitate ad un utilizzo in vb vero?? o sto sbagliando??
cmq corro a guardare i tuoi articoli sul sito credo proprio che trovero' qlk che ancora nn so e di utile :k:
aaa