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

Signaler
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
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 :)

8 réponses

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
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 :)
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
pIconImage et nSize correspondent a quoi dans ton code ?
Tu les déclares de quel manières et comment tu les utilises ?

Shell
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
#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;iidCount;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 :)
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
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 :)
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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;
}
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
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 :)