Newsgroup: it.comp.lang.visual-basic
Titolo: [OT forse] regsvr32

Cosa fa esattamente regsvr32
quando registra un ocx o una dll?
                                    danilo


Crea un riferimento alle classi pubbliche definite in tale ocx/dll.
Se frughi sulla HKEY_CLASSES_ROOT ne hai riprova.
ciao
ugo

 quando registra un ocx o una dll?
Credo chiami un metodo pubblico (di cui ora mi sfugge il nome) che fa parte
dell'interfaccia di ocx e dll activex...
Quindi teoricamente puo' fare di tutto, dipende da com'e' implementato
l'activex

 l'activex
?
la regsrv32 può soltanto registrare e deregistrare la typelib della libria
nel registro
di windows ovvero creare tutti i riferimenti (CLSID, ProgID, GUID della
TypeLib,
etc) alla libreria e/o alle classi in essa contenute. no more :)
ciao
--
Fibia "BrokenHeart" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #26 delle Mitiche Brigate Takahashi sezione Sud

 ?
Quello che volevo dire e' che della registrazione non si occupa regsvr32,
che si limita a richiamare l'API da te citata e NON a scrivere nel registro
i riferimenti vari.
Quindi ogni processo di registrazione e' proprietario dell'activex e diverso
caso per caso. Intuitivamente invece uno si immagina (perlomeno per me era
cosi') che ogni activex venga registrato meccanicamente nello stesso modo.
La DLLRegisterServer puo' fare di tutto, dipende da chi ha implementato la
dll/ocx (almeno credo). Immagino anche che diversi "warm" si basino proprio
su questo per infettare il PC...


 cosi') che ogni activex venga registrato meccanicamente nello stesso modo.
eccellente spiegazione :)
in genere la routine DLLRegisterServer non fa altro che scrivere GUID e
compagnia bella nel registro ma può essere utilizzata per qualunque altro
scopo (positivo o negativo). il processo di registrazione fa tutti quei
controllini d'obbligo quali la ricerca delle dipendenze.
--
Fibia "Sakamoto" FBI


controllini d'obbligo quali la ricerca delle dipendenze.
Proprio cosi' :-)
Tramite le funzioni esportate 
STDAPI DllRegisterServer(void) ;
STDAPI DllUnregisterServer(void) ;
l' activex puo' scrivere nel registry tutto quanto lecitamente occorre
per il proprio corretto funzionamento, ma non c'e' controllo su altre
attivita' anche dannose (ecco perche' sono contrario agli activex
sulle pagine web).
Una possibile grezza implementazione in vb, a puro titolo
sperimentale, ma funzionante, di quello che fa regsvr32 e' dopo la firma.
Con l' occasione, viene sfruttata la CreateThread (ci hai giocato
un po' con questa, eh Fibia ?) per chiamare una funzione,
avendone il puntatore.
ciao, hal
----------------------------------------------------------------------------------
'
' REGSVR32 in visual basic
'
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" _
                        Alias "LoadLibraryA" ( _
                        ByVal lpLibFileName As String _
                        ) As Long
Private Declare Function GetProcAddress Lib "kernel32" ( _
                        ByVal hModule As Long, _
                        ByVal lpProcName As String _
                        ) As Long
Private Declare Function FreeLibrary Lib "kernel32" ( _
                        ByVal hLibModule As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
       (ByVal hHandle As Long, ByVal dwMilliseconds As Long) _
       As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal _
        hObject As Long) As Long
 
Private Declare Function CreateThread Lib "kernel32" _
        (lpThreadAttributes As Any, ByVal dwStackSize As Long, _
        ByVal lpStartAddress As Long, ByVal lParameter As Long, _
        ByVal dwCreationFlags As Long, lpThreadID As Long) As _
        Long
Private Declare Function GetExitCodeThread Lib "kernel32" _
        (ByVal hThread As Long, lpExitCode As Long) As Long
 
Private Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode _
        As Long)
Const STATUS_WAIT_0 = &H0
Private Const pNULL     As Long = 0
Private Const NOERROR   As Long = 0
Private Function Registra(ByVal a_strPathName As String) As Boolean
    Dim hModule  As Long
    Dim pFunc    As Long
 
    hModule = LoadLibrary(a_strPathName)
    If LoadLibrary_Failed(hModule) Then Exit Function
    pFunc = GetProcAddress(hModule, "DllRegisterServer")
    If (pFunc <> pNULL) Then
        Registra = CallAFunctionByPtr(pFunc, 3000)
        FreeLibrary (hModule)
    End If
End Function    '// Registra
Private Function LoadLibrary_Failed(ByVal hModule As Long) As Boolean
    LoadLibrary_Failed = (hModule = 0)
End Function    '// LoadLibrary_Failed
Private Function CallAFunctionByPtr(ByVal a_FuncPtr As Long, _
                            ByVal a_WaitMilliSec As Long _
                            ) As Boolean
    Dim hThread     As Long
    Dim ret         As Long
 
    hThread = CreateThread(ByVal 0, 0, ByVal a_FuncPtr, _
                            ByVal 0&, 0&, 0&)
    If (hThread = 0) Then Exit Function
 
    ' da 3 secondi al thread per eseguirsi
    If (WaitForSingleObject(hThread, a_WaitMilliSec) = STATUS_WAIT_0) Then
        '// OK
        Call CloseHandle(hThread)
        CallAFunctionByPtr = True
    Else
        '// KO
        Call GetExitCodeThread(hThread, ret)
        Call ExitThread(ret)
        Call CloseHandle(hThread)
    End If
End Function    '// CallAFunctionByPtr
Public Sub Main()
    Dim strPathName As String
    strPathName = Command$
    If Len(strPathName) = 0 Then Exit Sub
    If Len(Dir$(strPathName)) = 0 Then Exit Sub
    If Registra(strPathName) Then
        MsgBox "La registrazione di " & strPathName & " e' riuscita", vbInformation
    Else
        MsgBox "La registrazione di " & strPathName & " e' fallita", vbCritical
    End If
End Sub

 avendone il puntatore.
[ZICHI ZACHI]
come sei esagerato :))
chiamare la createthread.. non bastava la CallWindowProc?
c'è più o meno lo stesso esempio su AllApi
ciao


Grazie di tutto ragazzi, siete stati molto esaurienti,
il problema č che oltre a ciň volevo capire il perchč
di una registrazione.
Ci sono delle DLL che non devo registrare.
E' perchč sono delle vere dll?
P.S.
        Tutta la discussione č comunque stata
utile ed interessante grazie ancora.
                                                danilo

 E' perchè sono delle vere dll?
perché le vere DLL non richiedono registrazione.
le loro funzioni sono esportate ovvero sono richiamabili tramite
API. Gli activex invece, come si è già detto, possiedono solo
poche funzioni richiamabili tramite API e tutto il lavoro viene
svolto dal COM che ne rende disponibili le funzioni/classi con-
tenute.
Detto in maniera barbara (no Roal, molla la gamba..argh)
gli ActiveX sono DLL con uno strato (interfaccia) in più. Tale
strato è chiamato COM (component object model) e provvede
la via di comunicazione tra il programma e le funzioni contenute
nella libreria. Affinché il COM funzioni regolarmente è necessario
che l'AX sia registrato nel sistema - ovvero scritto nel registro.
--
Fibia "Yuuhuu.. il COM verrà abolito in VB.Net" FBI


c'č piů o meno lo stesso esempio su AllApi
Grazie: trovato e scaricato :-)
Avevo pensato alla CallWindowProc, ma, erroneamente, credevo che
non avrebbe funzionato passando 0& come handle di finestra.
Grazie mille :-)
ciao, hal

 gli activex dll ed ocx.
Per essere ancora piu' precisi:
la funzione DllRegisterServer non e' obbligatoria, per cui non e'
detto che tutti gli A-X (dll ed ocx) esportino tale funzione (anche
se in pratica sono veramente pochi quelli che non lo fanno). In caso
il COMponente non la esporti e' necessario registrarlo a mano (se
non c'e' un programma di installazione che provvede a farlo), in
quanto pure regsvr (che utilizza la suddetta funzione) fallirebbe.
Ciao.