begin process at 2012 05 29 16:19:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

pourkoi je n'arrive pas updater les ressources de mon propre prog


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

pourkoi je n'arrive pas updater les ressources de mon propre prog

vendredi 30 juillet 2004 à 00:40:05 | pourkoi je n'arrive pas updater les ressources de mon propre prog

youpiyoyo

voila j'ai un prog ki tourne et j'aimerai updater les resources de mon prog, bien k'il soit toujours entrain de tourner


je fais ca

char* CurDirz=0;
TCHAR tohBuffer[MAX_PATH];
CurDirz = tohBuffer;

GetModuleFileName(NULL,CurDirz, MAX_PATH);

MessageBox(0,CurDirz,0,0);

HANDLE hUpdateRes = BeginUpdateResource(CurDirz, FALSE);
if (hUpdateRes == NULL)
{
MessageBox(0,"Could not open file for writing.",0,0);
}


BOOL result = UpdateResource(hUpdateRes,RT_ICON,MAKEINTRESOURCE(104),MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH),
pIconImage,nSize);
if (result == FALSE)
{
MessageBox(0,"Could not add resource.",0,0);
}

if (!EndUpdateResource(hUpdateRes, FALSE))
{
MessageBox(0,"Could not write changes to file.",0,0);
}

aucune message d'erreur mais aucune trace de la rassource ke je viens d'ajouter

en revanche si je le fais sur une dll ou exe extérieur ca marche

aby suggestions??
youpi :)
vendredi 30 juillet 2004 à 10:18:45 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

DeAtHCrAsH

Tu ne peux pas Update les ressources d'un programme en cours d'utilisation!

Si je me rappelle bien de ton poste précédent, tu cherches a modifier l'icone de tes programmes.

En utilisant UpdateResource, sache que tu sera obligé de mettre un icone avec les memes caracteristique que le l'ancien (taille et nombre de couleur).


J'ai ssayé avec la méthode des UpdateResource, mais a vrai dire je ne suis arrivé a rien de concluant avec les aides trouver sur le net.

Le mieux est de te servir de la structure des PE (Portables Executable). Ainsi tu modifies direcetement les bytes correspondant a ton image.

Shell
vendredi 30 juillet 2004 à 10:21:21 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

youpiyoyo

bah écoute moi j'arrive a mettre une icone dans une resource, et je suis dans prendre une ico dans une resource et l'extraire et a ce ke l'on pourait croire c plus cho de l'extraire ke de la mettre....

youpi
vendredi 30 juillet 2004 à 10:40:48 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

DeAtHCrAsH

pIconImage et nSize correspondent a quoi dans ton code ?
Tu les déclares de quel manières et comment tu les utilises ?

Shell
vendredi 30 juillet 2004 à 10:44:36 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

youpiyoyo


#pragma pack( push )
#pragma pack( 2 )
typedef struct
{
BYTE bWidth; // Width of the image
BYTE bHeight; // Height of the image (times 2)
BYTE bColorCount; // Number of colors in image (0 if >=8bpp)
BYTE bReserved; // Reserved
WORD wPlanes; // Color Planes
WORD wBitCount; // Bits per pixel
DWORD dwBytesInRes; // how many bytes in this resource?
WORD nID; // the ID
} MEMICONDIRENTRY, *LPMEMICONDIRENTRY;
typedef struct
{
WORD idReserved; // Reserved
WORD idType; // resource type (1 for icons)
WORD idCount; // how many images?
MEMICONDIRENTRY idEntries[1]; // the entries for each image
} MEMICONDIR, *LPMEMICONDIR;
#pragma pack( pop )


#pragma pack( push )
#pragma pack( 2 )
typedef struct
{
BYTE bWidth; // Width, in pixels, of the image
BYTE bHeight; // Height, in pixels, of the image
BYTE bColorCount; // Number of colors in image (0 if >=8bpp)
BYTE bReserved; // Reserved
WORD wPlanes; // Color Planes
WORD wBitCount; // Bits per pixel
DWORD dwBytesInRes; // how many bytes in this resource?
WORD nID; // the ID
} GRPICONDIRENTRY, *LPGRPICONDIRENTRY;
#pragma pack( pop )


#pragma pack( push )
#pragma pack( 2 )
typedef struct
{
WORD idReserved; // Reserved (must be 0)
WORD idType; // Resource type (1 for icons)
WORD idCount; // How many images?
GRPICONDIRENTRY idEntries[1]; // The entries for each image
} GRPICONDIR, *LPGRPICONDIR;
#pragma pack( pop )


typedef struct
{
BYTE bWidth; // Width, in pixels, of the image
BYTE bHeight; // Height, in pixels, of the image
BYTE bColorCount; // Number of colors in image (0 if >=8bpp)
BYTE bReserved; // Reserved ( must be 0)
WORD wPlanes; // Color Planes
WORD wBitCount; // Bits per pixel
DWORD dwBytesInRes; // How many bytes in this resource?
DWORD dwImageOffset; // Where in the file is this image?
} ICONDIRENTRY, *LPICONDIRENTRY;

typedef struct
{
WORD idReserved; // Reserved (must be 0)
WORD idType; // Resource Type (1 for icons)
WORD idCount; // How many images?
ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of 'em)
} ICONDIR, *LPICONDIR;

typedef struct
{
UINT Width, Height, Colors; // Width, Height and bpp
LPBYTE lpBits; // ptr to DIB bits
DWORD dwNumBytes; // how many bytes?
LPBITMAPINFO lpbi; // ptr to header
LPBYTE lpXOR; // ptr to XOR image bits
LPBYTE lpAND; // ptr to AND image bits
} ICONIMAGE, *LPICONIMAGE;

typedef struct
{
BOOL bHasChanged; // Has image changed?
TCHAR szOriginalICOFileName[MAX_PATH]; // Original name
TCHAR szOriginalDLLFileName[MAX_PATH]; // Original name
UINT nNumImages; // How many images?
ICONIMAGE IconImages[1]; // Image entries
} ICONRESOURCE, *LPICONRESOURCE;

typedef struct
{
DWORD dwBytes;
DWORD dwOffset;
} RESOURCEPOSINFO, *LPRESOURCEPOSINFO;
// EXE/DLL icon information - filename, instance handle and ID
typedef struct
{
LPCTSTR szFileName;
HINSTANCE hInstance;
LPTSTR lpID;
} EXEDLLICONINFO, *LPEXEDLLICONINFO;



void PutIconToRes(LPCTSTR szFile)
{
LPICONDIR pIconDir;
DWORD uRead,nSize;
LPICONIMAGE pIconImage;


HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
pIconDir = (LPICONDIR) malloc( sizeof( ICONDIR ) );

ReadFile( hFile, &(pIconDir->idReserved), sizeof( WORD ), &uRead, NULL );
ReadFile( hFile, &(pIconDir->idType), sizeof( WORD ), &uRead, NULL );
ReadFile( hFile, &(pIconDir->idCount), sizeof( WORD ), &uRead, NULL );
pIconDir = (LPICONDIR)realloc( pIconDir, ( sizeof( WORD ) * 3 ) + ( sizeof( ICONDIRENTRY ) * pIconDir->idCount ) );
ReadFile( hFile, pIconDir->idEntries, pIconDir->idCount * sizeof(ICONDIRENTRY),&uRead, NULL );

// Loop through and read in each image
for(int i=0;i<pIconDir->idCount;i++)
{

pIconImage = (LPICONIMAGE)malloc( pIconDir->idEntries[i].dwBytesInRes );

SetFilePointer( hFile, pIconDir->idEntries[i].dwImageOffset,NULL, FILE_BEGIN );
// Read the image data
nSize=pIconDir->idEntries[i].dwBytesInRes;
ReadFile( hFile, pIconImage, pIconDir->idEntries[i].dwBytesInRes,&uRead, NULL );


}

/*char* CurDirz=0;
TCHAR tohBuffer[MAX_PATH];
CurDirz = tohBuffer;

GetModuleFileName(NULL,CurDirz, MAX_PATH);*/

//MessageBox(0,CurDirz,0,0);

HANDLE hUpdateRes = BeginUpdateResource("test resource.exe", FALSE);
if (hUpdateRes == NULL)
{
MessageBox(0,"Could not open file for writing.",0,0);
}


BOOL result = UpdateResource(hUpdateRes,RT_ICON,MAKEINTRESOURCE(104),MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH),
pIconImage,nSize);
if (result == FALSE)
{
MessageBox(0,"Could not add resource.",0,0);
}

if (!EndUpdateResource(hUpdateRes, FALSE))
{
MessageBox(0,"Could not write changes to file.",0,0);
}


//
free( pIconImage );
//

}


tu trouveras tout ici
youpi :)
vendredi 30 juillet 2004 à 10:59:10 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

DeAtHCrAsH

En fait ce que tu souhaites faire maintenant c'est recuperer le 104 qui correspond a l'ID de ton icone dans l'executables a modifier c'est ca ?

Shell

vendredi 30 juillet 2004 à 11:03:46 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

youpiyoyo

ouai en gros c ca mais c pour mon prog en général,

j'ai reussi mais le truc c si il y a pas de RT_GROUP_ICON, dans la façon ke je fais ca marche pas...

enfin bref je vais mettre mon source pour ke tu comprennes...

en ce ki concerne ma question de ce thread: la solution va etre surement d'updater une dll, ki va sharer c resource avec mon prog
youpi :)
vendredi 30 juillet 2004 à 11:11:36 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

DeAtHCrAsH

Pas besoin de mettre ta source je vois ce que tu veux dire.
Dans mon code j'utilise aussi le RT_GROUP_ICON.
On ne peut pas faire sans à cause de la structure des PE.
Le RT_ICON correspond seuleuement a l'emplacement des bytes de l'ICON. Le RT_GROUP_ICON correspond a l'ensemble de l'icone et c'est celui la qu'il nous faut.

Ainsi avec le code que j'ai commencé, j'arrive a récuprer l'ID de n'importe quel icone dans les PE.

Voici mon code en entier mais l'UPDATE NE MARCHE PAS:

#include <windows.h>
#include <stdio.h>
#include "resource.h"

HWND hDlg;
HINSTANCE hInst;

void Alerte(char *Message, UINT uType)
{
MessageBox(hDlg,Message,"ALERTE",uType);
}

bool EnumNamesFunc(HMODULE hModule, LPCTSTR lpType, LPTSTR lpName, LONG lParam)
{
HGLOBAL hResLoad;
HRSRC hRes;
LPVOID lpResLock;
HANDLE hUpdateRes;
BOOL result;
HICON hGround;

char *buffer = new char[50];

if((ULONG)lpName & 0xFFFF0000)
{
sprintf(buffer,"%s",lpName);
}
else
{
sprintf(buffer,"%u",lpName);
}

Alerte(buffer,MB_ICONINFORMATION);
/*
hRes = FindResource(hModule,lpName,RT_GROUP_ICON);
if(hRes == NULL)
{
Alerte("Erreur lors de la recherche de la resource!",MB_ICONSTOP);
return false;
}
*/
/*
hResLoad = LoadResource(hModule,hRes);
if(hResLoad == NULL)
{
Alerte("Erreur lors du chargement de la resource!",MB_ICONSTOP);
return false;
}

lpResLock = LockResource(hResLoad);
if(lpResLock == NULL)
{
Alerte("Erreur lors du verouillage de la resource!",MB_ICONSTOP);
return false;
}
*/

hGround = (HICON) LoadImage(NULL, "d:\\valve.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
if(hGround == NULL)
{
Alerte("ICON PAS CHARGER",2);
return false;
}
hUpdateRes = BeginUpdateResource("d:\\Crack.exe",FALSE);
if(hUpdateRes == NULL)
{
Alerte("Erreur lors du démarrage de l'update de la resource!",MB_ICONSTOP);
return false;
}

result = UpdateResource(hUpdateRes,RT_ICON,MAKEINTRESOURCE(lpName),MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),hGround, SizeofResource(hModule, hRes));
if(result == false)
{
Alerte("Erreur lors de l'update de la resource!",MB_ICONSTOP);
}

if (!EndUpdateResource(hUpdateRes, FALSE))
{
Alerte("Erreur de Fin d'Updtae!",MB_ICONSTOP);
}

return true;
}


bool GetResource()
{
int res;
HMODULE hModule;

hModule = LoadLibrary("D:\\Crack.exe");
if(hModule == NULL)
{
Alerte("Erreur lors du chargement du fichier!",MB_ICONSTOP);
FreeLibrary(hModule);
return false;
}

res = EnumResourceNames(hModule,RT_GROUP_ICON,(ENUMRESNAMEPROC)EnumNamesFunc,0);
if(res == NULL)
{
Alerte("Erreur lors de l'énumération des resources!",MB_ICONSTOP);
FreeLibrary(hModule);
}

return true;
}
vendredi 30 juillet 2004 à 11:19:25 | Re : pourkoi je n'arrive pas updater les ressources de mon propre prog

youpiyoyo

alors tiens va voir

http://www.cppfrance.com/code.aspx?id=25021

c toujours en construction

donc scuse pour le mank de clareté dans mon code

mais les enumresource je vais l'utilisé un peu plus tard kan j'aurai fini ce ke je veux faire


je t'explike pour koi ton updateresource ne marche pas

tu le fais sur HICON hGround;

si tu regarde le msdn il te dis

lpData
[in] Pointer to the resource data to be inserted into the executable file. If the resource is one of the predefined types, the data must be valid and properly aligned. Note that this is the raw binary data stored in the executable file, not the data provided by LoadIcon, LoadString, or other resource-specific load functions. All data containing strings or text must be in Unicode format; lpData must not point to ANSI data.


donc c également pour un HICON, il fo k'il soit unicode et raw bianary...

de plus il ne fo pas ke les header + offset +etc... (toutes les infos de l'ico) donc tout ce ki est avant le '('

au début j'avais pensé com toi.... c vrai ke cela aurait été plus simple je te l'accorde, il pourait tout de meme faire un fonction ki accepete de transfaser le HICON, pour le mettre en resource


youpi :)


Cette discussion est classée dans : prog, messagebox, curdirz, hupdateres, updater


Répondre à ce message

Sujets en rapport avec ce message

messagebox et l'heure [ par mat74 ] Salut a ts j'aimerai bien afficher ds un messagebox qqchose du genre :heure de debut : l'heure au commencement du progheure de fin : l'heure a la ferm 0 error 0 warning mais le prog refuse de se lancer [ par JRB ] mon probleme apparait lorsque je declare : for (int x = 0 ; x {m_ClientSocket[x].SetParentWindow(this);}quand je met seulement : m_ClientSocke Réveiller un prog à heure fixe. [ par julien20vt ] Bonjour,J'aurais besoin dans mon programme de spécifier une heure de réveil.Un peu comme un sleep(x minutes) mais de la forme (sleep jusqu'a telle heu Passage d'une instance d'une classe d'un prog à un autre par une shared memory [ par vinvay ] Voici la classe que j'utilise :class MsgQueue{ private: int msg_max; //Message *msgqueue; char msg[100][100]; public: int indd, indf; MsgQueue(in .def sous VC++ [ par AlexMAN ] Hello all, alors voilà le pb : j'ai commencé la prog dll en C sous VC++ mais mais mes fonctions une fois compilé ont des décorations. Ex : intlen devi help me please !!! [ par NYHC ] Slt à tous ceux qui liront mon message, voici donc le pblm:il me faudrait un prog en c qui afficherait la table de vérité d'une expression booléenne à ouvrir un fichier avec un prog defini (pas par default) [ par enigmatiqk ] bon ba je me suis balader de partt, et pour ouvrir un fichier jai capter qu'il falli utilisé shellexecute..., seulement voila, ca ouvre un fichier par [MFC] poblème de splitter [ par TibobiT ] Bonjour à tous,j'ai trouvé un exemple de CSplitterWnd que j'ai appliqué à un prog tout simple pour voir.Je n'utilise qu'un seul splitter, les panneaux Que fait Dev Cpp pour un prog win? [ par floindahouse1 ] Lorsque je crée un projet "programme windows" sous dev cpp, et que je remplace tout le main.cpp par:#...int main(){MessageBox(....)}lorsque je lance l Scanner un serveur FTP [ par shaolinn ] hello tlmVoici mon probleme : Je cherche a scanner un serveur FTp,pour cela j'utilise la librairie wininetje me sert de cette fonction :HINTERNET FtpF


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,529 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales