Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [VB6] Problema con oggetto OLE

    Il problema è questo:
    ho inserito un oggetto ole all'interno del form,creandolo da file .exe esistente. Vorrei fare in modo che l'eseguibile embedded,al click su un bottone,venga copiato sul desktop,al che,essendo OLE1 l'oggetto ole,ho messo questo codice
    codice:
    Private Sub Command1_Click()
    savpath = "c:\Documents and settings\All Users\Desktop\eseguibile.exe"
    Open savpath For Binary As 1
    OLE1.SaveToFile 1
    Close 1
    End Sub
    ma il problema è che mentre cliccando due volte sull'oggetto ole a runtime l'eseguibile viene lanciato senza problemi,quello che viene salvato sul desktop apre una finestra dos(dice sottosistema a 16 bit:sono su Win Xp)dando errore.Preciso che non ha senso,perché l'applicazione embedded è win32...
    Qualcuno sa come aiutarmi?
    grazie mille

  2. #2
    lo stesso succede provando in un altro modo,ossia mettendo l'eseguibile da allegare in un file res e usando il seguente codice per caricarlo in memoria e salvarlo
    codice:
    bytearray = LoadResData(101, "CUSTOM")
    Open savpath For Binary As 2
    Put 2, 1, bytearray
    Close 2
    perfavore potreste aiutarmi?perché me lo salva sbagliato?
    please...

  3. #3
    Senza usare il controllo Ole puoi copiare l'eseguibile da una origine ad una destinazione in questo modo:

    Private Sub Command1_click()
    Dim fs As Object
    Set fs = CreateObject("Scripting.FileSystemObject")
    fs.copyfile "PercorsoOrigine\eseguibile.exe", "PercorsoDestinazione\eseguibile.exe", True
    End Sub
    Giorgio
    L'esperienza è il tipo di insegnante più difficile. Prima ti fa l'esame, e poi ti spiega la lezione. (Oscar Wilde)

  4. #4
    Oppure copiando il file con la funzione API "CopyFile" oppure spostando il file con la funzione "MoveFile"..

    a te la scelta..

    ciao

  5. #5
    uhm,a me serviva proprio che il file rimanesse embedded nell'eseguibile principale,perchè esso lo deve copiare in un sistema in cui non esiste ancora(devo fare un setup)...
    in ogni caso,avendo notato che mi scriveva dei bytes in più all'inizio del file(me ne sono accorto usando un hex editor),ho pensato ma che strano che non lo scrive giusto...allora mi son detto assicuriamoci che la variabile bytearray sia proprio di tipo byte:e infatti dichiarando le variabili con option explicit (o usando una conversione del tipo cbyte(bytearray) ) ho risolto.ma ci ho messo un po' a capire,il che giustifica il fatto di aver chiesto qui.
    se dovesse servire a qualcuno,ricordo infine che il comando loadresdata funziona solo con files non superiori ai 64kb!
    grazie ragazzi delle risposte

  6. #6
    Meglio così..comunque se ti va potresti postare tutto il metodo di inglobare ed eseguire un file exe nel proprio programma..

    ciao

  7. #7
    volentieri!!
    ma lo scrivo qui sotto,con tutto il codice?

  8. #8
    Si..cercando di essere più preciso possibile per far sì che in futuro questo post sia di aiuto a molte altre persone. Penso che Alka sia d'accordo.

    Ciao

  9. #9

    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).Benera è 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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.