Newsgroup: it.comp.lang.visual-basic
Titolo: [?][Lungo][VB6] egistrazione/Deregistrazione di DLL via codice per aggiornamento automatico...

Per evitare all'utente di dover aggiornare manualmente (mediante lancio di
un setup) le dll di ogni postazione stiamo implementando un sistema di
aggiornamento automatico delle nostre dll proprietarie prese da una
locazione centralizzata.
Detto a grandi linee ad ogni avvio un loader va a confrontare le dll e gli
eseguibili nella locazione centralizzata con quelli presenti sulla
postazione, se necessario (dopo essersi assicurato che nessuna istanza dei
programmi da aggioranre sia presente in memoria) procede a deregistrare le
dll locali, sovrascriverle con quelle aggiornate e registrare le nuove dll;
viene poi lanciato l'applicativo vero e proprio che a quel punto risulta
aggiornato.
Il problema è (come in parte si capisce dall'oggetto) avere un risultato
certo dell'operazione di registrazione e deregistrazione delle dll
(attualmente a causa di presunti problemi di incompatilibità con Windows NT4
SP6 siamo stati costretti a mettere da parte le api ed utilizzare in modo
"silente" il file regsvr32 che però non ci da nessuna informazione
sull'esito dell'operazione): da una lunga ricerca su internet siamo risuciti
a trovare le seguenti soluzioni (di cui allego il codice e la descrizione
dei problemi riscontrati).
Sarei curioso di sapere se qualcuno ha già incontrato il nostro stesso
problema ed ha trovato una soluzione "stabile".
Il seguente codice tratto da allapi (e derivante imho da esempio presente in
MSDN) non è adatto ai nostri scopi dato che dovremmo dichiarare 2N funzioni
un per ogni dll da dere/registrare: in più non ci permette di aggingere al
volo DLL:
----------------------------------------------------------------------------
----------------
'KPD-Team 1999
'URL: 
http://www.allapi.net/
'E-Mail: KPD...@Allapi.net
Declare Function DllRegisterServer Lib "ComCtl32.OCX" () As Long
Declare Function DllUnregisterServer Lib "ComCtl32.OCX" () As Long
    Const ERROR_SUCCESS = &H0
    ' To register your OCX use this function:
    If DllRegisterServer = ERROR_SUCCESS Then
        MsgBox "Registration Successful"
    Else
        MsgBox "Registration Unsuccessful"
    End If
    ' To unregister your OCX use this function:
    If DllUnregisterServer = ERROR_SUCCESS Then
        MsgBox "UnRegistration Successful"
    Else
        MsgBox "UnRegistration Unsuccessful"
    End If
-----------------------------------------------------------------------
Il seguente codice invece (derivante imho da un esempio scritto in C++)
permette di richiamare il metodo di registrazione/deregistrazione (presente
in ogni dll activex) specificandone semplicemente il percorso ed era adatta
al nostro scopo; purtroppo su alcuni Windows NT4SP6 va in crash
invalidandone l'utilità.
----------------------------------------------------------------------------
--------
' Add 2 Commandbuttons and a textbox to the form, and paste this code into
the form
Option Explicit
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As
Long) As Long
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 CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal
wParam As Any, ByVal lParam As Any) As Long
Private Const ERROR_SUCCESS = &H0
Private Sub Form_Load()
    Text1.Text = "C:\WINDOWS\SYSTEM\COMCTL32.OCX"
    Command1.Caption = "Register server"
    Command2.Caption = "Unregister server"
End Sub
Private Sub Command1_Click()
    Call RegisterServer(Me.hWnd, Text1.Text, True)
End Sub
Private Sub Command2_Click()
    Call RegisterServer(Me.hWnd, Text1.Text, False)
End Sub
Public Function RegisterServer(hWnd As Long, DllServerPath As String,
bRegister As Boolean)
    On Error Resume Next
    'KPD-Team 2000
    'URL: 
http://www.allapi.net/
    'E-Mail: KPD...@Allapi.net
    'We're going to call an API-function, without declaring it!
    ' Modified by G. Kleijer
    ' 
gkle...@casema.net
    ' going to call the DllRegisterServer/DllUnRegisterServer API of the
specified library.
    ' there's no need to use the Regsvr32.exe anymore.
    ' Make sure the path is correct and that the file exists, otherwise VB
will crash.
    Dim lb As Long, pa As Long
    lb = LoadLibrary(DllServerPath)
    If bRegister Then
        pa = GetProcAddress(lb, "DllRegisterServer")
    Else
        pa = GetProcAddress(lb, "DllUnregisterServer")
    End If
    If CallWindowProc(pa, hWnd, ByVal 0&, ByVal 0&, ByVal 0&) =
ERROR_SUCCESS Then
        MsgBox IIf(bRegister = True, "Registration", "Unregistration") + "
Successful"
    Else
        MsgBox IIf(bRegister = True, "Registration", "Unregistration") + "
Unsuccessful"
    End If
    'unmap the library's address
    FreeLibrary lb
End Function
----------------------------------------------------------------------------

 delle dll
Beh, una volta avevo descritto come faccio io:
Internet Explorer.
Metti su una macchina W2k un pacchetto di un Ocx o un Vbd fittizio, in cui
hai manualmente inserito tutti i componenti che ti servono (dll, Ocx, olb,
ecc...).
Poi semplicemente fai
http://nome_server/nome_condivisione_web/nome_pacchetto_fittizio.htm
et voilà.
Il tuo ocx fittizio farà semplicemente un Label1.Caption="Installazione
completata"
Quando appare, puoi chiudere IE e tutto è a posto.
Io lo uso da tre anni e non ho mai sbagliato un colpo (W95, W98 prima ed.,
W98SE, WME, W2k, WXP, e tutto generato in automatico col PDW).
Ciao
Alberto

 
http://nome_server/nome_condivisione_web/nome_pacchetto_fittizio.htm
Uhm purtroppo la cosa deve funzionare anche per chi ha un "server" win98 che
utilizza anche come postazione di lavoro; installare un webserver per via
telefonica è fuori discussione imho! :(


Prendo dal tuo post:
"aggiornamento automatico delle nostre dll proprietarie prese da una
locazione centralizzata."
Quindi, il flusso totale di informazioni, che sia su Lan o su modem, è pari
al totale dei componenti da aggiornare.
Anzi, IE trasferisce un CAB, quindi compresso, con altre modalità
trasferisci ocx e dll non compresse.
Se invece stavi parlando di una distribuzione su CD o similari, allora non
avevo capito.
Però per fare cose tipo: c'è un nuovo ActiveX, lo devo distribuire a mille
client, su Lan o su Web che sia, non c'è niente di meglio di un IIS o un PWS
(che gira anche su 98), con un pacchettino di aggiornamento creato
direttamente dal pdw. Facile, rapido ed efficace.
Oltretutto, lo stesso IE ti crea, se qualche componente non si registra, un
bel log chiaro ed esauriente, per cui anche le prime volte ci si salta fuori
benissimo.
Ciao
Alberto
--
E non so se avrò gli amici a farmi il coro,
o se avrò soltanto volti sconosciuti,
canterò le mie canzoni a tutti loro
e alla fine della strada
potrò dire che i miei giorni li ho vissuti...

 aggiornato.
E' più o meno ciò che facciamo anche noi.
Però, dovresti:
- cercare nuovi compinenti
- se trovati deregistrare i vecchi (con i vecchi file!)
- copiare i nuovi
- sei li hai copiati perchè mai dovrebbe fallire la registrazione?
- eseguire il nuovo programma
Ciao

Albe ... mica puoi spiegare meglio sta cosa ... mi interessa non
poco ... mi riferisco al fatto di creare quella cab e robina annessa
e connessa.
-- 
Saluti
Andrea Moro

Non l'ho provato ... ma mi sà che fa al caso tuo
http://www.mvps.org/vbnet/index.html?code/reg/regshareddlls.htm
-- 
Saluti
Andrea Moro

Prova ad aprire il progetto setup1.vbp  che viene fornito insieme ad vb6,
troverai un bas di nome basSetup1 che contiene la procedura RegisterFiles
...
e tanto altro
--
Carlo Alberto
xsiem.xta...@tin.it
  (togli le x)
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.476 / Virus Database: 273 - Release Date: 24/04/2003

 e tanto altro
Si appoggia a una dll del setup, e poi non c'è come deregistrare la dll
imho! :(

 
http://www.mvps.org/vbnet/index.html?code/reg/regshareddlls.htm
Purtroppo il nome trae in inganno: il sorgente crea una lista delle shared
dll prese dal registry di windows! :-(

 e connessa.
Non è che voglia un minuto.
Crea un progetto UserControl, mettici una label e un commandbutton, compila,
crea il pacchetto per distribuzione web, e fai qualche prova...
Comunque su MSDN e KB c'è di tutto.
Ciao
Alberto

 - eseguire il nuovo programma
Infatti: ">> viene poi lanciato l'applicativo vero e
             >> proprio che a quel punto risulta aggiornato."
Ciao,
un Lord Rayden che a volte ha il dubbio di non essere capito! :(

dunque, non quoto niente perche' non sono nemmeno sicuro di aver
capito il problema, ma non sarebbe piu' facile se tu installassi tutto
su una directory condivisa da un server? cosi' dovresti "solo"
aggiornare i files sul server ogni volta che fai un aggiornamento del
tuo programma.
il client gestionale che utilizzo in ufficio funziona cosi': sul
server sul quale gira il db c'e' una partizione condivisa dove hanno
installato dll ed eseguibili del client e quando vengono a fare un
aggiornamento software "semplicemente" sovrascrivono i files in quella
partizione.
ok, in rete hai un po' di traffico quando il client viene lanciato la
mattina, ma e' una cosa assolutamente accettabile.
saluti.
-- 
Gianni Rondinini
Icem s.r.l.
Tel: 
+39 0545 78036
Fax: 
+39 0545 78727

 mattina, ma e' una cosa assolutamente accettabile.
Il programma si appoggia oltre che su Access anche su MSSQL e MySQL (tutti i
cursori sono lato server e le query sono disegnate in modo da ridurre al
minimo lo scambio di dati tra client e server): in questi casi può
funzionare anche tramite ADSL con prestazioni ridotte... far scaricare anche
le DLL a ogni avvio è invece proibitivo imho