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

    Aggiungere risorse a EXE già compilato

    Ciao a tutti,
    ho realizzato un piccolo tool con VB.NET 2010 e l'idea è quella di distribuirlo ai miei clienti.
    Una richiesta che ho ricevuto più di una volta è quella di poter inserire il logo dell'azienda
    nella pagina principale.
    Di per sè una richiesta semplice da soddisfare, se non fosse che una prerogativa del tool
    è che possa funzionare stand alone, una sorta di tool portable.
    Un logo in un file esterno rappresenta una notevole scocciatura, sopratutto considerando che
    la volta che viene spostato senza il file con l'immagine, alla fine il logo non viene più visualizzato.
    Ovvio, non vorrei nemmeno prendere in cosiderazione un'installazione x via di un logo!! :-P

    Stavo indagando sul web e ho trovato una strada percorribile ma che non riesco a far funzionare:
    utilizzando tool tipo "Resource Hacker" o similari, è possibile aggiungere un'immagine all'exe già
    compilato. Il problema però è che poi non ho modo di utilizzare tale immagine da codice.. voglio dire,
    ho provato a scrivere nel mio codice una scansione delle risorse al boot per catturare l'immagine
    del logo e usarla se presente, però non viene vista tra le risorse...
    Questo tool darebbe anche la possibilità si sostituire una risorsa "immagine" e potrebbe essere più
    semplice da far digerire ma in questo caso non sono capace di configurare una risorsa in VB.NET che poi sia visibile dal tool esterno per poi sostituirla.
    Nessuno ha esperienza nell'uso delle risorse, e gestione post compilazione?
    Qualsiasi altra idea valida x cambiare un logo ad un exe già compilato sarebbe ben accetta!! :-D

    Grazie in anticipo
    Andrea

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Di che immagine parliamo? Una icona? Una bitmap di quali dimensioni?

    Perché non l'aggiungi alle risorse e compili tutto al posto di intervenire inutilmente sull'exe?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Grazie per la rapida risposta.
    Direi che non importa che tipo di immagine.. bitmap, png, jpg.. farei adattare l'immagine al formato per il quale trovo una soluzione.
    Il problema è che non vorrei essere io a dover ricompilare l'exe ogni volta che qualcuno vorrebbe inserire un nuovo logo.
    Immaginiamo x semplicità che io fornisca questo tool ad un distributore, quest'ultimo potrebbe cambiare il logo senza avere i sorgenti.
    Come dimensioni, immaginiamo 80 x 100.. per dare due valori a caso.. non credo sia un problema di immagine piccola o grande ma di metodo..
    Grazie

  4. #4
    Cercando sul web, ho trovato un metodo percorribile, credo però non riesco a finalizzarlo correttamente:
    appendere l'immagine al file exe (inserendolo in modo binario nel file exe).
    Alla fine però dovrei essere in grado di leggere in qualche modo, col metodo stream il file exe stesso... ma non so come.
    qualcuno può darmi una dritta?
    Penso risolverei ilo problema.
    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    302
    Questi erano trucchi che si facevano al tempo di MS-DOS !!
    Una volta compilato il programma EXE, si appende alla fine del file l'immagine che ti interessa, però il problema è che il programma (e quindi il sorgente) deve sapere quanto è grande il file che vai ad aggiungere, perchè deve poi calcolarsi da quale punto deve leggere questa immagine.
    Se tu vuoi poter attaccare una immagine di cui però ancora non sai quanto è grande, si può fare anche questo, però diventa un po' più complicato.
    Sicuro di voler seguire questa strada ??
    Se sì, dimmelo che ti spiego i passaggi da fare.
    Sergio

  6. #6
    Ciao,
    a dir la verità è una strada che mi permetterebbe di evitare la canna del gas!
    Ovviamente se puoi aiutarmi e risolvere il problema lavorando con le risorse sarebbe fantastico!
    Purtroppo non è facile, ci sto sbattendo la testa da un po'..
    Giusto x allinearti, sto cercando di scrivere un tool esterno che dovrebbe essere in grado di aggungere una risorsa immagine al mio exe..
    purtroppo non ho capito bene se è possibile, sul web sembra di sì ma non ho trovato un esempio chiaro.
    Sto cercando di farlo in 3 steps:
    1. Creare un file di resources
    Dim objData As Byte() = Nothing Dim strString As String
    Dim rsw As Resources.ResourceWriter


    ' estraggo il contenuto del file in un array di Byte
    objData = IO.File.ReadAllBytes("LOGO_NEW.bmp")
    strString = IO.Path.GetFileNameWithoutExtension("LOGO_NEW.bmp" )


    'Creates a resource writer instance to write to MyResource.resources.
    rsw = New Resources.ResourceWriter("MyResource.resources")


    'Adds the image to the resource.
    ' "MyImage" is the name that the Image is identified as in the resource.
    rsw.AddResource(strString, objData)
    rsw.Close()
    2. aggiungere il file al mio exe.. non ho idea come, sto investigando...
    3. per poi sperare che sia visibile dal codice del mio exe:
    runTimeResourceSet = My.Resources.ResourceManager.GetResourceSet(System .Globalization.CultureInfo.InvariantCulture, False, True) For Each dictEntry In runTimeResourceSet
    ListBox1.Items.Add(dictEntry.Key)
    If dictEntry.Key = "LOGO_NEW" Then
    'PictureBox1.Image = Image.FromStream(My.Resources.ResourceManager.GetS tream(dictEntry.Key))
    PictureBox1.Image = My.Resources.ResourceManager.GetObject(dictEntry.K ey)
    End If


    'If (dictEntry.Value.GetType() Is GetType(Bitmap)) Then
    ' Console.WriteLine(dictEntry.Key)
    'End If
    Next
    quindi... capirai bene che sto cercando una soluzione meno orrenda... ma faccio molta fatica.
    Se riesci ad aiutarmi sulla strada sopra indicata ti ringrazio moltissimo!!

    ..altrimenti la strada dell'appendere all'exe sarebbe un workaround che onestamente accetterei.

    Grazie 1000 per il momento!
    Ciao
    Andrea

  7. #7
    dimenticavo..
    per quanto riguarda la lunghezza nel caso della strada dell'appendere, pensavo di scrivere all fine del file exe, dopo l'immagine, un testo con la lunghezza in byte, quindi, prima leggo quello poi vado a recuperare l'immagine con l'offset indicato dal messaggio inserito:
    esempio:
    0000000543
    leggendo gli ultimi 10 byte dell'exe saprei che l'immagine inizia al byte 543 dell'exe stesso..

    Ciao
    Andrea

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    302
    Esatto, era più o meno quello che avevo in mente, solo che gli ultimi 4 byte non ti danno l'offset di dove è memorizzato il file aggiuntivo, ma semplicemente riportano la dimensione del file aggiunto, sarebbe un po' troppo complicato calcolare l'offset.
    Quindi devi aprire il file EXE, posizionarti alla fine del file, tornare indietro di 4 byte, leggerli (ad esempio leggi 12584), tornare indietro di altri 12584 byte (tenendo presenti i 4 già letti), leggere 12584 byte e ti ritrovi con la tua immagine.

    Sergio

  9. #9
    Ok.. cerco di avventurarmi ancora un po' nel trovare una soluzione con le risorse.. poi se non riesco implemento questo.
    sono riuscito ad inserire la risorsa del logo nell'exe ma ora ho difficoltà a leggerlo... accidenti...
    Questo è il codice x scrivere:
    Dim myAssembly As AssemblyDefinition = AssemblyDefinition.ReadAssembly("MioExe.exe") Dim rcaTemp As New EmbeddedResource("LOGO", ManifestResourceAttributes.Public, IO.File.ReadAllBytes("LOGO_NEW.bmp"))
    myAssembly.MainModule.Resources.Add(rcaTemp)
    myAssembly.Write("MioExe1.exe")
    se apro poi l'assembly, vedo la nuova risorsa ma non ho capito come prelevare l'immagine..

    Qualche esperienza in merito o consigli?

  10. #10
    Sono contento di informarvi che ho risolto!!

    Quindi, riassumendo, per inseririlo da un tool esterno:
    Dim myAssembly As AssemblyDefinition = AssemblyDefinition.ReadAssembly("MyExe.exe") Dim rcaTemp As New EmbeddedResource("LOGO", ManifestResourceAttributes.Public, IO.File.ReadAllBytes("Logo.bmp"))
    myAssembly.MainModule.Resources.Add(rcaTemp)
    myAssembly.Write("MyExe1.exe")
    E per estrarlo poi nell'exe stesso:
    Dim myAssembly As AssemblyDefinition = AssemblyDefinition.ReadAssembly(thisExe.ManifestMo dule.Name)

    For Each modl As Mono.Cecil.ModuleDefinition In From Modules As Mono.Cecil.ModuleDefinition In myAssembly.Modules
    Select Modules Order By Modules.Name()


    For Each res As Mono.Cecil.EmbeddedResource In modl.Resources
    If res.Name = "LOGO" Then
    Dim pictureBytes As New MemoryStream(res.GetResourceData())
    PictureBox1.Image = Image.FromStream(pictureBytes)
    End If
    Next
    Next
    Ho raggiunto il risultato utilizzando quindi la libreria mono.cecil reperibile in rete.
    Ciao a tutti.
    Andrea

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.