Capita a volte di voler creare,senza dover ricorrere a utilità come ad esempio il Package and deployment wizard fornito con Visual Studio 6.0,un setup in Visual Basic ;questo perché creare un setup per conto proprio,magari anche solo per un deployment-x-copy dei files sul sistema che li installerà(per deployment-x-copy si intende--soprattutto in Vb .Net--una semplice copia dei files senza necessità di registrazione di componenti COM o di qualsiasi altro tipo),equivale ad avere controllo su molte più opzioni dell'eseguibile da creare,dall'esecuzione di comandi con le API per scrivere nel registro o enumerare le cartelle speciali di sistema alla rifinitura dell'interfaccia grafica.
Immagino che in .Net un'operazione simile sia persino più rapida..ma per chi avesse bisogno di distribuire applicazioni leggere per non dover richiedere il .net framework come requisito di runtime(~22Mb contro ~1 della Visual Basic Virtual Machine msvbvm60.dll,ormai già presente di default su Win Xp e successivi),cè una via per creare un setup anche in Visual Basic 6.
Quel che intendo è riuscire a incorporare risorse dentro l'eseguibile principale,per poterle poi copiare e/o registrare su un sistema in cui non esistono ancora.
Va detto che questa operazione è possibile anche utilizzando dei software commerciali--o freeware(cito ad esempio lo shareware "Alloy" giusto per facilitare le ricerche su web di chi fosse interessato a questa categoria di programmi),ma per quanto riguarda Visual Basic ci sono,che io sappia,almeno due modi di ottenere lo scopo,l'uno più semplice l'altro leggermente più complesso,ma davvero nulla di trascendentale.Li descriverò entrambi,partendo dal più semplice.
Poniamo caso di voler incorporare un eseguibile PIPPO.exe nel nostro setup.
Il primo modo è prendere un controllo OLE,trascinarlo sul form e alla richiesta di inserimento oggetto selezionare "Crea dal file",per poi indicare PIPPO.exe come file desiderato.A questo punto si imposta,in modalità di sviluppo o anche da codice,la proprietà Visible del controllo OLE su False,e in una qualsiasi procedura ma possibilmente dopo che il form è stato caricato(il mio esempio è al click di un bottone),si mette il seguente codice:
codice:
Option Explicit
Private Sub Command1_Click()
Dim savpath As String
Dim bytearray() As Byte
savpath = "C:\PIPPO.exe"
Open savpath For Binary As 1
OLE1.SaveToFile 1
Close 1
End Sub
Cosa fa il codice?Beh,ricordando che l'option explicit è vivamente consigliato(serve per essere sicuri che la variabile bytearray sia effettivamente un array di tipo byte e non variant),il codice in questione apre un file binario,e scrive sul file binario il contenuto dell'oggetto OLE.Importante notare che il file dev'essere binario,e non sequenziale o ad accesso casuale
(in poche parole non si deve scrivere:
Open savpath For Output As 1),
perché il metodo SaveToFile dell'oggetto OLE richiede un file binario per la scrittura.Il file va chiuso col comando Close,mentre per aprirne più di uno assicuratevi che il numero sia diverso dai precedente o usate l'istruzione freefile
(es: FileNum=Freefile
Open savpath For Binary As FileNum)
Infine savpath è il percorso del file da salvare,quindi ho messo come esempio C:\PIPPO.exe ma avrei anche potuto usare un'altra directory,chiamare il file PLUTO.exe o addirittura cambiargli l'estensione(PIPPO.mbd--->risultato:file illeggibile fino a nuova conversione nel formato corretto);insomma dipende da cosa si vuol fare.
Ma siccome sto scrivendo ovvietà,passo al secondo metodo.Attenzione:questa via in realtà è meno potente della prima,perché richiede che il file da incorporare non sia più grande di 64kb,ed è quindi più adatto a riprodurre al limite icone,piccole bitmap o file audio all'interno dell'applicazione.
Dato che di default Visual Basic non ha queste opzioni attivate,si va sul menu Add-Ins>Add-In Manager:vi ritroverete la lista dei servizi attivabili.Scorrete fino a "VB 6 Resource Editor"(dovrebbe essere il terz'ultimo dal fondo),e cliccate su entrambe le caselle di spunta "Loaded/Unloaded" e "Load on Startup".Avrete così attivato l'editor di risorse di Visual Basic(dovreste vedere un'icona verde simile a quella del regedit su nella barra degli strumenti Standard).Bene
ra è possibile aggiungere risorse da incorporare.
Andate sul menu Project>Add New Resource File,selezionate la directory e cliccate su Apri,vi chiederà se volete creare il file:sì.Adesso nella finestrella di progetto a destra vi troverete una cartellina con scritto Related Documents:cliccate due volte sul file al suo interno e vi si aprirà l'editor di risorse.Qui come vedete è possibile aggiungere mediante i pulsanti vari tipi di risorse:stringhe,file di icona,cursori,bitmap,e con l'ultimo pulsante,risorse di tipo Custom,ossia file con estensione di qualsiasi tipo.Spiegherò dopo come comportarsi con le icone,i cursori,e le bitmap,ma per ora notiamo che il nostro PIPPO.exe è un eseguibile e quindi è una risorsa Custom.Aggiungiamolo col bottone.Si creerà una cartella "CUSTOM" e il file avrà un identificativo,di solito 101.Basta cliccare due volte sul file per cambiare l'id,id che ci serve per accedere alla risorsa da codice,e che può anche essere PIPPO,così è più chiaro.Ora salviamo e torniamo al progetto.Quando compilo e creo il setup,il file di risorsa viene incorporato nell'applicazione e non è visibile.Ma allora come fare a caricare in memoria il file incorporato per poi salvarlo,sempre sotto forma di file binario? E' presto detto.Questo codice
codice:
Option Explicit
Private Sub Command1_Click()
Dim savpath As String
Dim bytearray() As Byte
savpath = "C:\PIPPO.exe"
bytearray = LoadResData(101, "CUSTOM")
Open savpath For Binary As 2
Put 2, 1, bytearray
Close 2
MsgBox "Installazione completata con successo!", vbInformation, "Installazione"
End Sub
permette di caricare su array di byte il contenuto della cartella "CUSTOM" del file di risorsa(e precisamente quel contenuto identificato dal numero 101,o "PIPPO" se a suo tempo avete chiamato la risorsa così),per poi salvarlo su file come già visto in precedenza;il che implica che potete incorporare nella cartella "CUSTOM" più di un eseguibile,o anche altro tipo di file,basta che ciascuno non superi i 64kb(altrimenti il comando LoadResData non funge) nonchè abbia id diverso dagli altri.Da notare qui che per i file binari si usa l'istruzione Put,e non Write.Il secondo parametro dell'istruzione(nel nostro caso l'1) indica il byte da cui partire a scrivere.Consiglio:lasciatelo così.
Ancora un'ultima considerazione:se incorporate delle icone,cursori o bitmap,il comando appropriato è un altro.Faccio un breve esempio per settare il contenuto di una picturebox con delle immagini incorporate:
codice:
Picture1.Picture=LoadResPicture(101,VbResBitmap) 'se si tratta di una bitmap
Picture1.Picture=LoadResPicture(101,VbResIcon) 'se si tratta di un'icona
Picture1.Picture=LoadResPicture(101,VbResCursor) 'se si tratta di un cursore
Personalmente,ho sempre trovato queste tecniche molto utili;e spero di essere stato il più esaustivo possibile.Fatemi sapere.
Ciauz a tutti