Newsgroup: it.comp.lang.visual-basic
Titolo: costruire una dll no un ActiveX dll

premessa: Voglio costruire un dll non un dll activeX
dovo poi le funzioncine dovranno essere richiamate con declare .....
si può o no??!!!

 si può o no??!!!
Saro' breve e conciso. NO!
--
Fibia "Sakamoto" FBI
URL: 
www.geocities.com/fibiafbi
E-Mail: 
fibi...@hotmail.com
ICQ UIN 63586057

 si puņ o no??!!!
si, si puņ. in Visual C, per esempio
Ciao  :)
Faber

 si può o no??!!!

 (sviluppato da un volenteroso volontario :)
Hyperion, stai a schezza'?
VOGLIO saperlo.


 wrote in message
news:8k3s54$59m$1...@pegasus.tiscalinet.it...


Allora, supponiamo che abbiate già l'add-on in questione (datemi il vostro
indirizzo e la versione di Visual Basic che usate, e ve lo mando).
Passate al menu "File", sotto "Crea vattelapesca.dll" (sì, dovete creare una DLL
ActiveX, con gli exe non funziona) dovrebbe esserci "Hook compilation".
Selezionate questa voce, dovrebbe comparire, se tutto va bene, un messaggio che
dice "Compiler is hooked". Se qualcosa non va, deselezionate tutti gli add-on
escluso, ovviamente, il Compile Controller, e riavviate Visual Basic. Se non
funziona nemmeno così, mi dispiace ma questo meraviglioso orizzonte non vi si
aprirà mai.
Allora, mettiamo che invece abbia funzionato. Inserite un modulo di classe così,
giusto per gradire, e lasciatelo lì a scaldarsi, sicuro che presto lo farete
entrare in campo (povero illuso). Inserite ora un normalissimo modulo. Iniziamo
con una funzione semplice:
Public Sub aboutBox()
    MsgBox "An example of a VB DLL with API exports"
End Sub
e per ora lasciamola lì.
Introduciamo ora un paio di Declare ed una funzione che sarà vitale:
Private Declare Function lstrlen Lib "kernel32" _
Alias "lstrlenA" ( _
lpString As Long _
) As Long
Private Declare Function lstrcpyn Lib "kernel32" _
Alias "lstrcpynA" ( _
ByVal lpStringDestination As String, _
lpStringSource As Long, _
ByVal lngMaxLength As Long _
) As Long
Function CStringToVBString(lpCString As Long) As String
    Dim lenString As Long, sBuffer As String
    Dim lpBuffer As Long
    Dim lngStringPointer As Long, refStringPointer As Long
    If lpCString = 0 Then
        CStringToVBString = vbNullString
    Else
        lenString = lstrlen(lpCString)
        sBuffer = String$(lenString + 1, 0)
        lpBuffer = lstrcpyn(sBuffer, lpCString, lenString + 1)
        CStringToVBString = sBuffer
    End If
End Function
Infatti i programmi che chiamano funzioni esportate da DLL si aspettano che
dall'altro lato ci sia un programma C/C++ o Delphi, e anzichè stringhe passano
degli indirizzi a 32 bit (Long) che puntano alle stesse. Le funzioni lstrlen e
lstrcpyn sono intrinseche di C/C++ (ma forse dico una cazzata), in VB è
necessario usare gli equivalenti esportati da kernel32.dll
Questo per introdurre una nuova funzione, più interessante:
Public Function showMessage(ByRef msgln As Long) As Long
    MsgBox CStringToVBString(msgln)
    showMessage = 1
End Function
In pratica il programma esterno passa una stringa alla funzione e la funzione
mostra questa stringa con una finestra di messaggio.
E' ora di compilare, siamo pronti. File / Crea Progettox.dll (e mi raccomando:
compilate in codice nativo! non in p-code!!!) Dovrebbe fermarsi tutto e
comparire il pannello di controllo di Compile Controller. Ignorate tutto quello
che vedete: c'è chi può spiegarvi molto meglio di me a cosa serve C2.exe, a cosa
serve generare un listato, e cose così: cliccate "Skip to linking", lì qualcosa
ne capisco.
Allora, quella che vedete è la riga di comando finale ("Scrittura della DLL in
corso", avete presente?). Da me è così:
LINK "E:\desktop\Classe1.OBJ" "E:\desktop\Modulo1.OBJ"
"E:\desktop\Progetto1.OBJ" "E:\PROGRAMMI\DEVSTUDIO\VB\VBAEXE5.LIB" /ENTRY:__vbaS
/OUT:"E:\desktop\Progetto1.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0
/VERSION:1.0 /DLL /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078
Io vi ho detto: ne capisco qualcosa. Non è vero. In realtà non capisco una sola
lettera di tutto questo ambaradan.
So solo che se aggiungete /VXD creerete una VXD (non gasatevi troppo perchè
tanto non funzionano). E che se aggiungete /DEF potete specificare quali
funzioni di quali moduli esportare. Sì, ecco quello che ci interessa.
Create un file qualcosa.def (il nome non è importante), contenente il seguente
testo:
LIBRARY Progetto1
DESCRIPTION "Example of a normal DLL created in VB"
EXPORTS
 aboutBox = ?aboutBox@Modulo1@@AAGXXZ
 showMessage = ?showMessage@Modulo1@@AAGXXZ
(quelle robacce là sono i decorated name delle funzioni; funzionano così:
?nomefunzione@nomemodulo@@AAGXXZ)
Ora aggiungete /DEF:"percorsodelfile.def" e cliccate Finish Compile. "Già
fattoooooooo?" proprio così!!!

 indirizzo e la versione di Visual Basic che usate, e ve lo mando).
Comunque tutto cio' si puo' fare semplicemente anche senza l'add-on,
sostituendo LINK.exe con un programmino vb che richiami il vero LINK.exe
(opportunamente rinominato) passandogli la riga di comando con l'aggiunta
della riga "/DEF:" ecc. ecc.
Ciao.

 wrote

Questa e' quella che definirei "trovata geniale"!
Complimenti davvero.

 della riga "/DEF:" ecc. ecc.
però se non prendi il Controller non saprai mai come bloccare la chiamata ad una
funzione ^__^

è quello che, tecnicamente, si chiama wrapper, ed è un "trucco" molto usato dai
"pirati", ed è una cosa che sto disperatamente cercando di fare per sostituire
Shell32.dll con una mia versione "personalizzata" che intercetti le chiamate a
funzioni, come
quella-che-mette-l'icona-nel-tray-che-non-ricordo-più-come-si-chiama...
Roal, io so che è possibile, nelle DLL, "redirigere" certe funzioni a funzioni
esportate da altre librerie, ho dimenticato il termine tecnico ma non importa,
sai se il linker può bastare?

 funzione ^__^
Perdonami, non riesco a capire cosa intendi dire.
Ciao.

[cut]

o, più semplicemente:
Public Function ShowMessage(ByVal stMessage As String) As Long
    Dim strMessage As String
    strMessage = StrConv(stMessage, vbUnicode)
    MsgBox strMessage
    ShowMessage = 1
End Function
e, come dichiarazione:
Public Declare Function ShowMessage Lib "MiaDLL.dll" _
    (ByVal strMessage As String) As Long
Ciao  :)
Faber
P.S.: a voi funziona se chiamate Dir$() in una di queste sub?
a me genera errore in msvbvm60.dll ...