PDA

View Full Version : [c++] inserire immagini in file exe


Rsk
21-07-2007, 13:34
sto realizzando un programma in c++, dovrei inserire un'imaggine in un file exe e appena si clicca sul file exe l'immagine deve venire estratta nella cartella corrente.
ho creato il file risorsa con questa sintassi:
img BITMAP "1.bmp"

ma non so come procedere.

mi sapete aiutare :D

afsdfdlecosdfsfdcco
21-07-2007, 14:56
sto realizzando un programma in c++, dovrei inserire un'imaggine in un file exe e appena si clicca sul file exe l'immagine deve venire estratta nella cartella corrente.
ho creato il file risorsa con questa sintassi:
img BITMAP "1.bmp"

ma non so come procedere.

mi sapete aiutare :D


Non credo sia possibile fare una cosa del genere...

71104
21-07-2007, 16:16
sto realizzando un programma in c++, dovrei inserire un'imaggine in un file exe e appena si clicca sul file exe l'immagine deve venire estratta nella cartella corrente.
ho creato il file risorsa con questa sintassi:
img BITMAP "1.bmp"

ma non so come procedere.

mi sapete aiutare :D per ottenere un puntatore alla risorsa:
FindResource (http://msdn2.microsoft.com/en-us/library/ms648042.aspx)
LoadResource (http://msdn2.microsoft.com/en-us/library/ms648046.aspx)
LockResource (http://msdn2.microsoft.com/en-us/library/ms648047.aspx)

poi per scrivere tutta la roba nel file usa delle comunissime CreateFile/WriteFile oppure fopen/fwrite. per chiudere il file naturalmente CloseHandle oppure fclose.

71104
21-07-2007, 16:16
Non credo sia possibile fare una cosa del genere... non hai mai visto un installer eseguibile autoestraente...? :wtf:

afsdfdlecosdfsfdcco
21-07-2007, 18:19
non hai mai visto un installer eseguibile autoestraente...? :wtf:

Scusate, adesso che ho riletto quello che voleva mi sono accorto di aver detto una cazzata. :mc:

Sorry :stordita:

Rsk
22-07-2007, 07:46
per ottenere un puntatore alla risorsa:
FindResource (http://msdn2.microsoft.com/en-us/library/ms648042.aspx)
LoadResource (http://msdn2.microsoft.com/en-us/library/ms648046.aspx)
LockResource (http://msdn2.microsoft.com/en-us/library/ms648047.aspx)

poi per scrivere tutta la roba nel file usa delle comunissime CreateFile/WriteFile oppure fopen/fwrite. per chiudere il file naturalmente CloseHandle oppure fclose.
grazie :D

ma ho un problema con la funzione
HRSRC FindResource(HMODULE hModule, LPCTSTR lpName, LPCTSTR lpType);

il file h lho chiamato img.h, l'immagine da caricare lho chiamata foto.

ho provato a definire la funzione cosi'

HRSRC FindResource(img,foto,RT_BITMAP);

ma nn va.

scusate ho iniziato da poco con il c++.. :(

71104
22-07-2007, 09:26
FindResource al primo parametro nel tuo caso vuole NULL perché devi prendere la risorsa dal tuo file eseguibile; al secondo invece devi passare l'identificatore numerico della risorsa scritto come stringa e preceduto da un #, per esempio "#258". infine al terzo parametro devi passare RT_BITMAP.

andbin
22-07-2007, 11:02
Questa funzione che ho fatto serve per salvare una risorsa su un file:
BOOL SaveResourceToFile (HMODULE hModule, LPCSTR lpName, LPCSTR lpType, LPCSTR lpszFilename)
{
HRSRC hRsrc;
HGLOBAL hGlobal;
DWORD dwSize, dwWritten;
LPVOID lpData;
HANDLE hFile;
BOOL bRet;

if ((hRsrc = FindResource (hModule, lpName, lpType)) == NULL)
return FALSE;

if ((dwSize = SizeofResource (hModule, hRsrc)) == 0)
return FALSE;

if ((hGlobal = LoadResource (hModule, hRsrc)) == NULL)
return FALSE;

if ((lpData = LockResource (hGlobal)) == NULL)
{
FreeResource (hGlobal);
return FALSE;
}

if ((hFile = CreateFile (lpszFilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
{
FreeResource (hGlobal);
return FALSE;
}

bRet = WriteFile (hFile, lpData, dwSize, &dwWritten, NULL) && dwWritten == dwSize;

CloseHandle (hFile);
FreeResource (hGlobal);

return bRet;
}
C'è solo una questione particolare da tenere presente. Se nel file .rc viene specificata una immagine nel modo tipico

nameID BITMAP filename

nel file eseguibile in realtà non ci sarà l'header iniziale di 14 bytes della immagine. Per questo motivo, se l'obiettivo è solamente quello di estrarre una risorsa per salvarla su file, la cosa migliore da fare è quella di assegnargli un tipo di risorsa custom, es MYBMP o qualunque altra cosa.

Naturalmente l'header iniziale si potrebbe anche rigenerare facilmente (sono pochi dati) e quindi scriverlo all'inizio del file prima di scrivere la risorsa. Ma la funzione che ho postato sarebbe da rivedere, in quanto adesso è "generica".

Rsk
22-07-2007, 13:30
ok grazie a tutti :D