Navicom Forum
Vuoi reagire a questo messaggio? Crea un account in pochi click o accedi per continuare.


 
IndiceUltime immaginiCercaRegistratiAccedi

Condividi | 
 

  Come creare un Masterizzatore in VB6

Visualizza l'argomento precedente Visualizza l'argomento successivo Andare in basso 
AutoreMessaggio
Valerio
Amministratore
Amministratore
Valerio

Messaggi Messaggi : 107
Crediti Crediti : 25033
Registrato Dal Registrato Dal : 17.10.10
Età Età : 27
Località Località : Ardea

 Come creare un Masterizzatore in VB6 _
MessaggioTitolo: Come creare un Masterizzatore in VB6    Come creare un Masterizzatore in VB6 EmptySab Ott 23, 2010 11:00 am

Premessa
Nero Burning Rom è uno dei programmi più diffusi per la scrittura di dati, musica, video e altro su CD e DVD e la versione 6.0, non solo presenta un'interfaccia grafica completamente rinnovata e intuitiva, riconosce tutti i masterizzatori CD e DVD più recenti ed fornisce decine di utili strumenti, ma anche consente l'interazione con i linguaggi di programmazione più attuali affinché i programmatori possano creare le proprie applicazioni Nero-based per masterizzare i propri dati.

Per fare ciò è stato rilasciato il Nero SDK v 1.0.3, scaricabile (in inglese) all'indirizzo Nero - Nero AG - Liquid Media to Simply Enjoy - Official Website, che contiene una serie di documenti in formato .pdf ed alcuni esempi in Visual Basic e Visual C++. La programmazione dei componenti di Nero avviene attraverso alcune librerie, tra cui NeroAPI.Dll e NeroCOM.Dll, più un ulteriore file chiamato NeroCMD.Exe per l'esecuzione da riga di comando.
La libreria NeroAPI.Dll, come dice il nome, contiene una serie di funzioni API che vengono utilizzate dall'applicazione Nero e che possono essere riutilizzate dal programmatore per creare la propria applicazione di masterizzazione basata su Nero, ma è (ovviamente...) rivolta ai programmatori di Microsoft Visual C++, così come esplicitato nella documentazione.
La libreria NeroCOM.Dll è una libreria dei tipi progettata appositamente per i linguaggi di programmazione quali Visual Basic, Delphi e tutti quei linguaggi che sfruttano le Dll/ActiveX.

In questo articolo mi riferirò quindi esclusivamente alla libreria NeroCOM.Dll, in un'applicazione di esempio scaricabile dall'Area Download del sito, che provvede a creare un CD-Rom dati scrivendovi dei files, realizzata modificando il progetto di esempio che viene fornito nel Nero SDK.
La grossa pecca di questo Software Development Kit è il fatto che largo spazio sia dedicato allo sviluppo in C++ con diversi documenti e numerosi esempi applicabili a diverse casistiche di masterizzazione, mentre l'unico esempio disponibile in codice sorgente VB mostra esclusivamente come creare un CD Audio con un'unica traccia, derivata da un file .Mp3. Pertanto ho cercato di raccogliere quante più informazioni sul Nero SDK Forum dove molti utenti propongono dei quesiti ai quali rispondono i creatori di Nero SDK. Vi consiglio di visitare il forum, anch'esso in inglese, dove si possono reperire numerose informazioni anche se non è permesso postare delle domande e anche se la navigazione è continuamente disturbata da fastidiosi pop-up che pubblicizzano prodotti per la creazione di DVD professionali.
Nell'SDK è contenuto un file, chiamato NeroCOM.Pdf, che illustra in maniera esaustiva, seppur in lingua inglese, tutte le caratteristiche della libreria ed è sicuramente il miglior punto di partenza per studiare lo sviluppo di un'applicazione basata sui componenti di Nero 6.

Desidero aggiungere che l'applicazione di esempio da me realizzata non consente funzioni avanzate come quella di creare una struttura a directory sul CD o l'utilizzo della tecnica del drag & drop per la creazione intuitiva del cd, in quanto il mio intento è quello di fornire le basi per scrivere su CD più files in una sessione ISO dati a differenza dell'esempio "ufficiale" limitato unicamente ad un cd audio peraltro con un solo file. Ulteriori e più utili informazioni possono essere reperite nel forum dell'Sdk e non sarà difficile implementare le varie soluzioni se si ha un minimo di conoscenza di lingua inglese.

Per la realizzazione dell'applicazione ho utilizzato la versione trial di Nero 6 scaricabile dal sito, completamente funzionante. Requisito necessario per l'utilizzo di NeroCom.Dll è, infatti, che sulla macchina di destinazione sia installata una versione funzionante di Nero 6 (trial o completa), in quanto la sola Dll ActiveX non è sufficiente poiché la stessa interagisce con i componenti di Nero che provvedono alla creazione dei supporti. Per l'utilizzo del componente è necessario leggere il contratto di licenza dell'applicazione e i dati riportati nella documentazione dell'SDK. Ricordo che, qualora utilizziate la versione trial, al termine dei 30 giorni di prova sarà necessario acquistare la licenza del prodotto.

Una semplice applicazione
Nei prossimi passaggi farò continui riferimenti all'applicazione di esempio a corredo di questo articolo, pertanto darò per scontato che l'abbiate scaricata.

L'unico form del programma contiene una TextBox nella quale l'utente specificherà l'etichetta del CD, la famosa label. Una casella combinata conterrà l'elenco delle periferiche disponibili tra cui masterizzatori, lettori e verosimilmente un masterizzatore virtuale detto image recorder, utilizzato per la creazione dei files immagine compatibili con lo standard ISO. Una ListBox conterrà l'elenco dei files che aggiungeremo alla compilation, una seconda TextBox esporrà i messaggi di sistema emessi da Nero nel corso del processo, mentre una barra di progresso indicherà il livello del procedimento di creazione del Cd. Da ultimi troverete dei pulsanti associati ad alcune operazioni che descriverò di seguito.

Operazioni preliminari
La prima operazione da compiere è creare un riferimento alla libreria NeroCom.Dll (menu Progetto/Riferimenti), e dichiarare le seguenti variabili nella finestra del codice:

Codice:
Codice:
Public WithEvents nero As nero        'un nuovo oggetto per le funzioni di Nero
  Public drives As INeroDrives          'serve per l'identificazione dei drives disponibili
  Public WithEvents drive As NeroDrive  'oggetto per l'utilizzo della periferica selezionata
  Public cnt As Integer
  Public Folder As INeroFolder          'per creare una cartella "radice" nel CD-Rom
  Public strMessages As String          'riceve i messaggi inviati dal motore di Nero

L'oggetto nero è stato dichiarato WithEvents in quanto la classe espone degli eventi che permettono di controllare lo stato del processo di masterizzazione. Noterete come in realtà la gestione degli eventi occupi la maggior parte del codice, proprio perché il controllo sul processo deve essere totale e riguarderà eventuali errori e lo stato del processo, dall'inizio alla fine. I vari eventi da gestire sono i seguenti:

Codice:
Codice:
 'Interviene se si verifica un errore e invia un messaggio di tipo string all'applicazione
  Private Sub nero_OnMegaFatal()
    strMessages = strMessages + "A mega fatal error has occurred." + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Se il cd-rw inserito non è vuoto invia un messaggio di errore
  Private Sub nero_OnNonEmptyCDRW(Response As NEROLib.NERO_RESPONSE)
    strMessages = strMessages + "CD-RW not empty!" + Chr(13) + Chr(10)
    edtMessages = strMessages
    Response = NERO_RETURN_EXIT
  End Sub

  'Interviene se l'utente interrompe il processo
  Private Sub drive_OnAborted(Abort As Boolean)
    Abort = False
    MsgBox "Process aborted by user"
  End Sub

  'Quando Nero aggiunge una nuova stringa al file di Log, la stessa viene visualizzata
  Private Sub drive_OnAddLogLine(TextType As NEROLib.NERO_TEXT_TYPE, Text As String)
    strMessages = strMessages + Text + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Al termine del processo di scrittura mostra il risultato
  Private Sub drive_OnDoneBurn(StatusCode As NEROLib.NERO_BURN_ERROR)
    strMessages = strMessages + Chr(13) + Chr(10) + nero.ErrorLog + Chr(13) + Chr(10)
    strMessages = strMessages + nero.LastError + Chr(13) + Chr(10)
    strMessages = strMessages + "Burn finished "
    If StatusCode <> NEROLib.NERO_BURN_OK Then
      strMessages = strMessages + "NOT (" & StatusCode & ")"
    End If
    strMessages = strMessages + "successfully!" + Chr(13) + Chr(10)
    edtMessages = strMessages

    ProgressBar.Value = 0
  End Sub

  'Sarà richiamato quando Nero termina l'attesa del supporto
  Private Sub drive_OnDoneWaitForMedia(Success As Boolean)
    strMessages = strMessages + "Done waiting for media." + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Calcola la percentuale di progresso dell'operazione e aumenta il valore della ProgressBar
  Private Sub drive_OnProgress(ProgressInPercent As Long, Abort As Boolean)
    Abort = False
    ProgressBar.Value = ProgressInPercent
  End Sub

  'Serve a conoscere la fase in cui si trova il processo (scrittura traccia, scrittura lead-in...)
  Private Sub drive_OnSetPhase(Text As String)
    strMessages = strMessages + Text + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Interviene se il sistema deve essere riavviato
  Private Sub nero_OnRestart()
    strMessages = strMessages + "The system is being restarted." + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Attende l'inserimento di un CD vuoto o riscrivibile
  Private Sub nero_OnWaitCD(WaitCD As NEROLib.NERO_WAITCD_TYPE, WaitCDLocalizedText As String)
    strMessages = strMessages + WaitCDLocalizedText + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Al termine dell'attesa del supporto, mostra un messaggio
  Private Sub nero_OnWaitCDDone()
    strMessages = strMessages + "Done waiting for CD." + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Viene richiamato se Nero attende un particolare tipo di supporto
  Private Sub nero_OnWaitCDMediaInfo(LastDetectedMedia As NEROLib.NERO_MEDIA_TYPE, _
                                      LastDetectedMediaName As String, _
                                      RequestedMedia As NEROLib.NERO_MEDIA_TYPE, _
                                      RequestedMediaName As String)
    strMessages = strMessages + "Waiting for a particular media type:" + Chr(13) + Chr(10)
    strMessages = strMessages + RequestedMediaName + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Se Nero ancora attende l'inserimento di un CD allora ci avvisa...
  Private Sub nero_OnWaitCDReminder()
    strMessages = strMessages + "Still waiting for CD..." + Chr(13) + Chr(10)
    edtMessages = strMessages
  End Sub

  'Questa funzione permette di selezionare un file immagine compatibile ISO per la scrittura
  Private Sub nero_OnFileSelImage(FileName As String)
    ImageFileDialog.CancelError = True
    On Error GoTo ErrHandler
    ImageFileDialog.Flags = cdlOFNHideReadOnly
    ImageFileDialog.FilterIndex = 2
    ImageFileDialog.ShowOpen
    FileName = ImageFileDialog.FileName
    Exit Sub
  ErrHandler:
    Exit Sub
  End Sub
Passiamo poi ad inizializzare gli oggetti e lo facciamo nell'evento Initialize del form. In questo modo, quando il form verrà caricato (evento Load) le informazioni sui dispositivi presenti saranno già disponibili:

Codice:
Private Sub Form_Initialize()
    Set nero = New nero  'un nuovo oggetto Nero

    ProgressBar.Value = 0 'azzera la progress bar
    strMessages = ""      'azzera il buffer dei messaggi

    'La variabile drives conterrà l'elenco dei dispositivi disponibili:
    Dim drives As IneroDrives
    Set drives = nero.GetDrives(NERO_MEDIA_CDR)

    'Aggiunge i dispositivi rilevati nell'apposita ComboBox
    For myIndex = 0 To drives.Count - 1
        AvailableDevices.AddItem drives(myIndex).DeviceName, myIndex
    Next

    AvailableDevices.ListIndex = 0
  ErrHandler:
    Exit Sub
  End Sub
La seguente semplice funzione NameFromPath separa il nome di un file dal pathname completo:

Codice:
Function NameFromPath(strPath As String) As String
    Dim lngPos          As Long
    Dim strPart        As String
    Dim blnIncludesFile As Boolean

    lngPos = InStrRev(strPath, "")
    blnIncludesFile = InStrRev(strPath, ".") > lngPos
    strPart = ""

    If lngPos > 0 Then
      If blnIncludesFile Then
        strPart = Right$(strPath, Len(strPath) - lngPos)
      End If
    End If

    NameFromPath = strPart
  End Function

Burn in progress
A questo punto passiamo a scrivere il codice per le varie azioni. Nell'applicazione di esempio potremo selezionare dei files, scrivere il CD, interrompere il processo e cancellare un CD-Rw. Il pulsante FileAdd permette di aggiungere files alla sessione, utilizzando il controllo SelectFileDialog:

Codice:
Codice:
Private Sub FileAdd_Click()
    SelectFileDialog.CancelError = True
    On Error GoTo ErrHandler
    SelectFileDialog.Flags = cdlOFNHideReadOnly
    SelectFileDialog.FilterIndex = 2
    SelectFileDialog.ShowOpen
    Elenco.AddItem SelectFileDialog.FileName

    Exit Sub

  ErrHandler:
    Exit Sub
  End Sub


Il pulsante cmdAbort permette l'interruzione del processo di scrittura. E' questa, ovviamente, un'azione sconsigliata, in quanto il supporto potrebbe essere poi inutilizzabile:

Codice:
Codice:
Private Sub cmdAbort_Click()
    nero.Abort
    MsgBox "Aborted by user"
  End Sub


Quest'azione scatenerà l'evento drive_OnAborted, per il quale è stato in precedenza fornito il codice di gestione, che mostrerà un messaggio all'utente.
E veniamo ora alla parte più complessa, la scrittura dei dati sul CD. Queste operazioni vengono svolte alla pressione del pulsante cmdBurn. Ho inserito dei commenti all'interno del codice sotto riportato per renderne più agevole la comprensione:

Codice:
Codice:
Private Sub CmdBurn_Click()

    Set Folder = New NeroFolder 'L'oggetto NeroFolder rappresenta la struttura delle
                                'directories su CD. Utilizzeremo l'oggetto per creare la
                                'directory radice ""

    'Nell'ambito dei driver rilevati viene utilizzato quello selezionato nella ComboBox contenente
    'l'elenco
    Dim drives As INeroDrives
    Set drives = nero.GetDrives(NERO_MEDIA_CDR)
    Set drive = drives(AvailableDevices.ListIndex)

    'Crea una nuova traccia compatibile con lo standard ISO
    Dim isotrack As NeroISOTrack
    Set isotrack = New NeroISOTrack

    isotrack.Name = Text1.Text    'l'etichetta del CD corrisponde al contenuto della textbox
    isotrack.RootFolder = Folder  'mentre la directory principale (radice) del CD è data dall'
                                  'oggetto Folder

    Dim nFiles() As New NeroFile  'Un oggetto NeroFile corrisponde al singolo file da aggiungere
                                  'alla sessione. Lo dichiariamo come array per contenere
                                  'più files

    ReDim Preserve nFiles(Elenco.ListCount)  'Rideterminiamo l'array col numero dei files aggiunti

    Dim i As Integer

    'Questo ciclo For..Next aggiunge alla directory (oggetto Folder) tutti i files prescelti
    For i = 0 To Elenco.ListCount - 1
      nFiles(i).Name = NameFromPath(Elenco.List(i))
      nFiles(i).SourceFilePath = Elenco.List(i)
      Folder.Files.Add nFiles(i)
      Debug.Print nFiles(i)      'se vogliamo vedere il nome del file in fase di Debug
    Next i

    'La proprietà BurnOptions della classe isotrack determina il tipo di CD da creare, utilizzando
    'le informazioni di sessione (Joliet) creando un CD di tipo ISO dati
    isotrack.BurnOptions = NERO_BURN_OPTION_USE_JOLIET Or NERO_BURN_OPTION_CREATE_ISO_FS

    'scrive ISO dati
    drive.BurnIsoAudioCD "", "", False, isotrack, Nothing, Nothing, _
                          NERO_BURN_FLAG_WRITE, 4, NERO_MEDIA_CD
    GoTo quit

  handle_error:
    strMessages = strMessages + Err.Description + Chr(13) + Chr(10) + nero.LastError
    edtMessages = strMessages
  quit:

  End Sub

Relativamente a quest'ultimo codice è bene precisare alcuni aspetti:

non è presente una routine On Error Goto in quanto il rilevamento degli errori avviene tramite il run-time di Nero e gli errori vengono restituiti in una stringa, trasmessa automaticamente all'applicazione che, grazie agli eventi, li espone;
viene utilizzato il metodo BurnIsoAudioCD in quanto non è contemplato (!) il caso di una semplice scrittura di una sessione dati; pertanto, passando come argomenti valori nulli (il metodo richiamerà l'oggetto NeroFolder che contiene le varie informazioni), verrà creato un CD dati.
A questo punto sarà sufficiente fare click per creare il nostro CD dati. Vorrei altresì precisare che nel corso dei test da me effettuati (solo su CD-Rw), ho notato che il buon esito dell'operazione è dipeso da diverse marche di CD.

Cancellazione di un cd-rw
La cancellazione di un CD-Rw utilizza alcuni oggetti già visti in precedenza ed è un processo relativamente semplice. Questo processo viene eseguito alla pressione del pulsante cmdErase di cui riporto il codice:

Codice:
Codice:
Private Sub cmdErase_Click()

    'vengono dichiarate le variabili necessarie ad identificare i dispositivi e a creare
    'una nuova directory radice vuota

    Set Folder = New NeroFolder
    Dim drives As INeroDrives
    Set drives = nero.GetDrives(NERO_MEDIA_CDR)
    Set drive = drives(AvailableDevices.ListIndex)
    Dim isotrack As NeroISOTrack
    Set isotrack = New NeroISOTrack

    'in questo modo verranno utilizzati i messaggi Joliet
    isotrack.BurnOptions = NERO_BURN_OPTION_USE_JOLIET Or NERO_BURN_OPTION_CREATE_ISO_FS

    Dim a  'Prima di procedere alla cancellazione, è necessario dichiarare una variabile alla quale
            'Nero assegnerà automaticamente il tempo necessario alla cancellazione del CD, senza la
            'quale si otterrebbe un messaggio di errore.

    If Combo1.Text = "Completa" Then
      a = drive.CDRWErasingTime(False)
      drive.EraseCDRW False
    Else
      a = drive.CDRWErasingTime(True)
      drive.EraseCDRW True
    End If

  'anche qui gli errori vengono rilevati tramite stringa dal run-time di Nero.
  handle_error:
    strMessages = strMessages + Err.Description + Chr(13) + Chr(10) + nero.LastError
    edtMessages = strMessages
  quit:
  End Sub

Conclusioni
Spero che le informazioni contenute in questo articolo siano state sufficienti a far capire come agisce la libreria dei tipi NeroCom.Dll nelle operazioni di base. Come ho già detto, nell'SDK di Nero è presente un documento PDF relativo a questa libreria, nel quale sono minuziosamente descritti tutti gli eventi, le proprietà ed i metodi delle varie classi, anche se il mio consiglio rimane quello di visitare il Forum del Nero SDK, in quanto troverete domande e risposte relative a casi pratici, che non sono presenti nella documentazione.

Fonte: Visual-Basic
Torna in alto Andare in basso
https://navicom-forum.forumattivo.com
 

Come creare un Masterizzatore in VB6

Visualizza l'argomento precedente Visualizza l'argomento successivo Torna in alto 
Pagina 1 di 1

Permessi in questa sezione del forum:Non puoi rispondere agli argomenti in questo forum.
Navicom Forum :: Programmazione In Generale :: Visual Basic-
Vai verso:  
Crea un forum | ©phpBB | Forum gratis di aiuto | Segnala un abuso | Ultime discussioni