PDA

View Full Version : Cambiare l'icona ad un eseguibile.


ciccio_g
14-03-2009, 14:40
Vorrei sapere se esiste un metodo per cambiare l'icona ad un eseguibile generato da Dev-C++ a partire da un file sorgente in c. In pratica volgio solo cambiare l'icona all'eseguibile e non creare un progetto all'interno del quale ovviamnete potrei dargli l'icona.
Premetto che ho gia scaricato vari MB dei programmi più svariati che si trovano in rete ma nessuno di essi ha funzionato. Qualcuno sa aiutarmi?

fero86
14-03-2009, 18:38
il MinGW non é il compilatore piu adatto per Windows, non sono neanche sicuro che abbia un resource compiler, che é quello che servirebbe a te: l'icona dell'eseguibile é la prima che Windows trova tra le risorse dello stesso.

DanieleC88
15-03-2009, 01:10
MinGW ha un resource compiler, windres, ultimamente ci ho sviluppato da Linux un'applicazione Win32 con tanto di risorse! :D
Resta da vedere però se sia compreso nel package di Dev-C++...

Ad ogni modo, se devi solo cambiare l'icona di un eseguibile forse fai prima con qualcosa come ResourceHacker (http://www.angusj.com/resourcehacker/) o un buon editor di icone (anticamente avevo MicroAngelo che mi sembra lo facesse, fai una ricerca e troverai sicuramente tante alternative gratuite).

ciao ;)

crazyboy92
15-03-2009, 07:19
Prova PE Explorer ;) è valido solo per 30 giorni.. Ma è ottimo!!

ciccio_g
16-03-2009, 21:03
Grazie a tutti, ma come dicevo ho provato i più svariati programmi, primi tra tutti resHacker e micro angelo ma non hanno funzionato. Seppure cambiano tranquillamente le icone ad altri eseguibili, tipo gli exe di programmi installati, per i file compilati da me non danno risultato. Per questo motivo ho creato questa discussione, sperando che passasse qualcuno competente in materia che avesse già avuto e risolto la mia stessa problematica, purtroppo non penso si risolva semplicemente trovando un programma in rete...

DanieleC88
17-03-2009, 00:18
Non si è ben capito come viene generato il tuo eseguibile e in cosa sia diverso dagli altri... Dacci una mano a darti una mano. :D

Hai un eseguibile, vuoi metterci un'icona: bene, in che modo lo stai facendo? Dici che è tuo, quindi puoi aggiungere a piacimento le risorse e ricompilarlo?

ciao ;)

ciccio_g
17-03-2009, 01:46
Non si è ben capito come viene generato il tuo eseguibile e in caso sia diverso dagli altri... Dacci una mano a darti una mano. :D

Grazie mille...
forse non si è capito bene:
dunque si tratta di un semplice file che genero con il compilatore dev c++...avendo a disposizione il file sorgente ovviamente potrei ricompilarlo a piacimento. Quello che voglio è creare un file exe però con un'icona che ci metto io e senza portarmi dietro altri file che servono per dargli l'icona, altrimenti potrei fare direttamente il progetto con dev o con visual studio.

DanieleC88
17-03-2009, 11:46
Ok, che tipo di progetto è? O compili il file "da solo"?
Se crei un progetto Windows crea un file di risorse (ad esempio "risorse.rc") con dentro scritto:
MAINICON ICON "icona.ico"

Metti l'icona nella cartella del progetto e ricompila. :)

ciccio_g
17-03-2009, 18:35
Forse è meglio che faccio un esempio. Diciamo che io scrivo il più classico dei programmi

#include <iostream.h>
int main (){
cout << "ciao";
system("PAUSE");
}

e lo compilo col nome ciao. Nella cartella dove si trova il file ciao.cpp verrà generato anche un file ciao.exe. Quello che voglio fare è prendere tale file e cambiargli l'icona, senza appoggiarmi ad altri file, in modo tale che copiando unicamente il file ciao.exe sul computer di mio fratello che ha 3 anni egli veda un'icona colorata in luogo di quella classica degli eseguibili e restandone attratto ci clicchi di sopra...
Spero questo esempio stupido possa chiarire la mi richiesta.
Grazie per l'aiuto.

fero86
17-03-2009, 19:56
a parte che l'esempio di codice é sbagliato... comunque DanieleC88 ti ha spiegato perfettamente cosa fare.

DanieleC88
17-03-2009, 20:57
Quello che voglio fare è prendere tale file e cambiargli l'icona, senza appoggiarmi ad altri file, [...]
Aspe', rileggi il mio ultimo post: il file che aggiungi serve solo in fase di compilazione, alla fine del processo di compilazione avrai un unico file, eseguibile, contenente l'icona da te specificata. ;)

In più il codice di esempio che hai postato è, effettivamente, sbagliato. :Prrr:

ciccio_g
17-03-2009, 21:08
a parte che l'esempio di codice é sbagliato... comunque DanieleC88 ti ha spiegato perfettamente cosa fare.

L'esempio di codice può essere obsoleto ma non è assolutamente sbagliato visto che lo ho appena compilato con Dev!!! Per il resto ho seguito pedissequamente le istruzioni di Daniele ma l'icona è rimasta sempre la stessa dell'eseguibile...

fero86
17-03-2009, 21:19
L'esempio di codice può essere obsoleto ma non è assolutamente sbagliato visto che lo ho appena compilato con Dev!!! il MinGW troppi che ne compila di sorgenti "sbagliati", cosi come molti altri compilatori; tuttavia un giorno potrebbe capitarti il compilatore pignolo o le impostazioni di compilazione pignole, quindi perché farsi del male riducendo la portabilitá dei propri sorgenti?


Per il resto ho seguito pedissequamente le istruzioni di Daniele ma l'icona è rimasta sempre la stessa dell'eseguibile... prova a sostituire "MAINICON" con "1":
1 ICON "icona.ico"
probabilmente MAINICON é definito da qualche header che avresti dovuto includere.

ovviamente ricordati di mettere un file "icona.ico" nella directory di compilazione.

DanieleC88
17-03-2009, 21:20
No, se stai compilando un file singolo Dev-C++ ti compila quel file, ne genera un file oggetto, e poi fa il linking di quell'oggetto in un file eseguibile. Hai bisogno di inserire il sorgente in un progetto Win32 (e mi sembra, tra l'altro, che Dev-C++ ti faccia scegliere automaticamente l'icona dell'eseguibile quando il progetto è Win32). Se Dev-C++ non te lo fa fare automaticamente, devi inserire anche il file .rc come ti ho spiegato prima: verrà generato un file oggetto anche per lui, e il linking all'eseguibile verrà fatto a partire da entrambi i file oggetto. ;)

Ultima nota: se un compilatore ti fa compilare, non ti assicura che il codice sia perfettamente corretto o conforme agli standard: magari ti fa compilare perché un particolare costrutto esiste solo su quel compilatore (è un'estensione degli standard) o perché il compilatore ha dei bug. :D

fero86
17-03-2009, 22:20
Ultima nota: se un compilatore ti fa compilare, non ti assicura che il codice sia perfettamente corretto o conforme agli standard: magari ti fa compilare perché un particolare costrutto esiste solo su quel compilatore (è un'estensione degli standard) o perché il compilatore ha dei bug. :D prima regola di Dr. House: non é mai lupus; prima regola del programmatore: non é mai un bug del compilatore :D
le estensioni al linguaggio e politiche di tolleranza da parte del compilatore sono volute.

prima che arrivi l'obiezione: si lo so, basta guardare il sistema di tracking dei bug del progetto del gcc per vedere che i bug del compilatore ci sono eccome; la "prima regola" di cui sopra é volutamente esagerata: non si contano piu le situazioni in cui il programmatore pensa che sia un bug del compilatore e con un'analisi piu approndita scopre che é solo colpa sua, é successo anche a me dopo quasi un decennio di esperienza in C++ (quella volta ero veramente in un vicolo cieco, mi sembrava un comportamento troppo assurdo, il debugger sembrava dirmi che il programma eseguiva una cosa totalmente diversa da quanto scritto nel sorgente; non mi ero piu trovato in una situazione simile per parecchi anni, ero seriamente convinto che fosse un bug del compilatore e invece indovina un po'? era colpa mia; dopo 8 anni di programmazione C++ era ancora colpa mia).

DanieleC88
17-03-2009, 22:26
Lo so, lo so... intendevo solo dire che una "compilazione pulita" non implica un codice corretto. E uno dei motivi potrebbe (potrebbe...) essere un bug del compilatore. :D

Harlus
21-12-2010, 19:46
Vorrei sapere se esiste un metodo per cambiare l'icona ad un eseguibile generato da Dev-C++ a partire da un file sorgente in c. In pratica volgio solo cambiare l'icona all'eseguibile e non creare un progetto all'interno del quale ovviamnete potrei dargli l'icona.
Premetto che ho gia scaricato vari MB dei programmi più svariati che si trovano in rete ma nessuno di essi ha funzionato. Qualcuno sa aiutarmi?

Anch'io ho lo stesso problema. Premetto che le mie conoscenze sulla programmazione sono molto rudimentali... Dunque, come compilatore uso lcc-win32, ho provato a creare un file risose.rc contenente il testo:
1 ICON "icona.ico"
Normalmente per compilare uso il comando:
lc programma.c -o programma.exe
Il risultato è un eseguibile funzionante ma senza l'icona da me voluta. Probabilmente bisogna specificare qualche parametro, infatti se digito semplicemente lc.exe, ottengo:
Usage: lc [-c] [compiler flags] files... [linker flags]
ie: lc -g2 hello.c -o hello.exe -s
Quindi ho supposto di dover specificare qualcosa nelle "linker flags". Se digito lcclnk.exe (che dovrebbe essere il linker), ottengo:

Lcclnk command line options. Options are introduced with the character '-' or t
he character '/'.
-o <filename>
Sets the name of the output file to file name. Insert a space between the o and the name of the file.
-errout <filename>
Write all warnings/error messages to the indicated file name.
-subsystem <subsystem>
Indicate the type of output file. Console or windows application
-stack-commit <number>
With this option, you can commit more pages than one (4096 bytes).
-stack-reserve <number>
The default stack size is 1MB. This changes this limit.
-dynamic
Use lcclibc.dll as default library and link to it dynamically instead of linking to libc.lib.
-dll
This option indicates to the linker that a .dll should be created instead of an .exe.
-map <filename>
Indicates the name of the map file.This option is incompatible with the -s option.
-nolibc
Do not include the standard C library.
-s Strips all symbolic and debugging information from the executable.
-version nn.nn
Adds the version number to the executable.
-errout=<filename>
Write all warnings or errors to the file name indicated.Note that no spaces
should separate the name from the equals sign.
-nounderscores
When creating a DLL for Visual Basic for instance, it is better to export names without underscores from a DLL.
-entry <fnname>
Option fo setting the DLL entry point to the given function
-version
Print the version name

E sinceramente in quest'ultimo elenco non ho capito molto, ma non mi sembra ci sia qualcosa riguardo ai file .rc
Specifico che i file icona.ico, risorse.rc, programma.c li ho messi tutti nella stessa cartella dove ci sono i file del compilatore (lc.exe, lcclnk.exe ecc...), quindi non penso che il problema sia che il compilatore non trovi il file.rc, dato che è tutto nella stessa cartella.

Inoltre già che ci sono ho un’altra piccola richiesta: è possibile fare eseguire il programma senza che si apra la finestra della console? In pratica il programma ha solo lo scopo di lanciare un altro programma(detto così sembra non avere molto senso, ma vi assicuro che ho i miei buoni motivi). Il risultato è che si vede aprirsi e chiudersi la finestra nera della console per una frazione di secondo, cosa che se è possibile preferirei evitare.

Ringrazio tutti anticipatamente per le risposte, se in alcuni punti non sono stato chiaro chiedete pure.