Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // .H
- #ifndef ICONCHANGER_H
- #define ICONCHANGER_H
- #include <windows.h>
- #include <tchar.h>
- #include <QString>
- typedef struct tagHEADER
- {
- WORD idReserved;
- WORD idType;
- WORD idCount;
- }HEADER, *LPHEADER;
- typedef struct tagICONDIRENTRY
- {
- BYTE bWidth;
- BYTE bHeight;
- BYTE bColorCount;
- BYTE bReserved;
- WORD wPlanes;
- WORD wBitCount;
- DWORD dwBytesInRes;
- DWORD dwImageOffset;
- }ICONDIRENTRY, *LPICONDIRENTRY;
- typedef struct tagGRPICONDIRENTRY
- {
- BYTE bWidth;
- BYTE bHeight;
- BYTE bColorCount;
- BYTE bReserved;
- WORD wPlanes;
- WORD wBitCount;
- DWORD dwBytesInRes;
- WORD nID;
- }GRPICONDIRENTRY, *LPGRPICONDIRENTRY;
- typedef struct tagGRPICONDIR
- {
- WORD idReserved;
- WORD idType;
- WORD idCount;
- GRPICONDIRENTRY idEntries[1];
- }GRPICONDIR, *LPGRPICONDIR;
- class IconChanger {
- public:
- // Members
- HRSRC hrResSource;
- HMODULE hExeSource;
- HGLOBAL hGlobSource;
- char *cFilePathSource;
- DWORD dwSizeOfSource;
- char* lpIconBuffer;
- int nIconCount;
- // Methods
- IconChanger();
- ~IconChanger();
- void GetIconFromSource(QString sIconPath, QString sExePath);
- void ChangeExeIcon(LPCTSTR lpIconFile, LPCTSTR lpExeName);
- private:
- };
- #endif // ICONCHANGER_H
- // .CPP
- #include "IconChanger.h"
- #include <iostream>
- using namespace std;
- #include <QMessageBox>
- #include <QDebug>
- BOOL ResNames(HMODULE hModule, LPCTSTR lpType, LPTSTR lpName, LONG lParam)
- {
- if (!IS_INTRESOURCE(lpName))
- {
- // cout << "Not int resource NAMES" << endl;
- // cout << "TYPE in Names: " << lpType << endl;
- //cout << "NAME in Names: " << lpName << endl;
- } else {
- // cout << "is int resource. NAMES" << endl;
- // cout << "TYPE in Names: " << (long)lpType << endl;
- // cout << "NAME in Names: " << (long)lpName << endl;
- if ( lpType == (RT_ICON + 11) )
- {
- char *cFilePath = new char[MAX_PATH];
- GetModuleFileName( hModule, cFilePath, MAX_PATH);
- HANDLE hCleanExe = NULL;
- hCleanExe = BeginUpdateResource(cFilePath, FALSE);
- if ( hCleanExe == NULL )
- {
- QMessageBox mess;
- mess.setText(QString("Begin Clean Up FAILED! - ").append(QString::number(GetLastError())));
- mess.exec();
- return FALSE;
- }
- if ( !UpdateResource( hCleanExe, lpType, lpName, MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL), NULL, 0) )
- {
- QMessageBox mess;
- mess.setText(QString("Cleaning Update FAILED! - ").append(QString::number(GetLastError())));
- mess.exec();
- return FALSE;
- }
- if ( !EndUpdateResource( hCleanExe, FALSE) )
- {
- QMessageBox mess;
- mess.setText(QString("End Cleanup FAILED! - ").append(QString::number(GetLastError())));
- mess.exec();
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- BOOL ResTypes(HMODULE hModule, LPTSTR lpType, LONG lParam)
- {
- if (!IS_INTRESOURCE(lpType))
- {
- // cout << "INT is not resource TYPE" << endl;
- // cout << "TYPE:" << lpType << endl;
- if ( lpType == (RT_ICON + 11) )
- {
- EnumResourceNames(hModule, lpType, (ENUMRESNAMEPROC)ResNames, 0);
- }
- } else {
- // cout << "INT is resource TYPE" << endl;
- // cout << "TYPE:" << (long)lpType << endl;
- if ( lpType == (RT_ICON + 11) )
- {
- EnumResourceNames(hModule, lpType, (ENUMRESNAMEPROC)ResNames, 0);
- }
- }
- return true;
- }
- IconChanger::IconChanger() // Constructor
- {
- hExeSource = NULL;
- hrResSource = NULL;
- hGlobSource = NULL;
- lpIconBuffer = NULL;
- }
- // Retrive Icon Buffer
- void IconChanger::GetIconFromSource(QString sIconPath, QString sExePath) // from source Exe/DLL
- {
- LPICONDIRENTRY pIconDirEntry(NULL);
- LPGRPICONDIR pGrpIconDir(NULL);
- HEADER header;
- LPBYTE pIconBytes(NULL);
- HANDLE hIconFile(NULL);
- DWORD dwRet(0), nSize(0), nGSize(0), dwReserved(0);
- HANDLE hUpdate(NULL);
- BOOL ret(FALSE);
- WORD i(0);
- //sIconPath.replace("\\", "\\\\", Qt::CaseSensitive);
- // sExePath.replace("\\", "\\\\", Qt::CaseSensitive);
- hExeSource = LoadLibrary( sExePath.toStdString().c_str() );
- if ( hExeSource == NULL )
- {
- QMessageBox mess; mess.setText("Unable to get handle to EXE/DLL\n" + sExePath );
- mess.exec();
- }
- hIconFile = CreateFile( sIconPath.toStdString().c_str(), GENERIC_READ,
- 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if ( hIconFile == INVALID_HANDLE_VALUE )
- {
- QMessageBox mess; mess.setText("Unable to open file.\n" + sIconPath );
- mess.exec();
- }
- ret = ReadFile( hIconFile, &header, sizeof(HEADER), &dwReserved, NULL );
- if (!ret)
- {
- CloseHandle(hExeSource);
- QMessageBox mess; mess.setText("Unable to Read Icon File " + sIconPath );
- mess.exec();
- return;
- }
- pIconDirEntry = (LPICONDIRENTRY)new BYTE[ header.idCount * sizeof(ICONDIRENTRY) ];
- if ( pIconDirEntry == NULL )
- {
- CloseHandle(hIconFile);
- QMessageBox mess; mess.setText("Unable to allocate memory for Icon Group Header" + sIconPath );
- mess.exec();
- return;
- }
- ret = ReadFile(hIconFile, pIconDirEntry, header.idCount*sizeof(ICONDIRENTRY), &dwReserved, NULL);
- if (!ret)
- {
- delete[] pIconDirEntry;
- CloseHandle(hIconFile);
- QMessageBox mess; mess.setText("Unable to read Icon Dir Entrys" + sIconPath );
- mess.exec();
- return;
- }
- nGSize = sizeof(GRPICONDIR)+header.idCount*sizeof(ICONDIRENTRY);
- pGrpIconDir = (LPGRPICONDIR)new BYTE[nGSize];
- ZeroMemory( pGrpIconDir, nSize );
- pGrpIconDir->idReserved = header.idReserved;
- pGrpIconDir->idType = header.idType;
- pGrpIconDir->idCount = header.idCount;
- // nIconCount = 0;
- for ( i = 0; i < header.idCount; i++ )
- {
- pGrpIconDir->idEntries[i].bWidth = pIconDirEntry[i].bWidth;
- pGrpIconDir->idEntries[i].bHeight = pIconDirEntry[i].bHeight;
- pGrpIconDir->idEntries[i].bColorCount = pIconDirEntry[i].bColorCount;
- pGrpIconDir->idEntries[i].bReserved = pIconDirEntry[i].bReserved;
- pGrpIconDir->idEntries[i].wPlanes = pIconDirEntry[i].wPlanes;
- pGrpIconDir->idEntries[i].wBitCount = pIconDirEntry[i].wBitCount;
- pGrpIconDir->idEntries[i].dwBytesInRes = pIconDirEntry[i].dwBytesInRes;
- pGrpIconDir->idEntries[i].nID = i+1;
- }
- EnumResourceTypes( hExeSource, (ENUMRESTYPEPROC)ResTypes, 0);
- cout << "Done. " << endl;
- CloseHandle(hIconFile);
- FreeLibrary(hExeSource);
- }
- IconChanger::~IconChanger() // De-Constructor
- {
- }
- void IconChanger::ChangeExeIcon(LPCTSTR lpIconFile, LPCTSTR lpExeName)
- {
- /*
- LPICONDIRENTRY pIconDirEntry(NULL);
- LPGRPICONDIR pGrpIconDir(NULL);
- HEADER header;
- LPBYTE pIconBytes(NULL);
- HANDLE hIconFile(NULL);
- DWORD dwRet(0), nSize(0), nGSize(0), dwReserved(0);
- HANDLE hUpdate(NULL);
- BOOL ret(FALSE);
- WORD i(0);
- pGrpIconDir->idReserved=header.idReserved;
- pGrpIconDir->idType=header.idType;
- pGrpIconDir->idCount=header.idCount;
- for(i=0;i<header.idCount;i++)
- {
- pGrpIconDir->idEntries[i].bWidth=pIconDirEntry[i].bWidth;
- pGrpIconDir->idEntries[i].bHeight=pIconDirEntry[i].bHeight;
- pGrpIconDir->idEntries[i].bColorCount=pIconDirEntry[i].bColorCount;
- pGrpIconDir->idEntries[i].bReserved=pIconDirEntry[i].bReserved;
- pGrpIconDir->idEntries[i].wPlanes=pIconDirEntry[i].wPlanes;
- pGrpIconDir->idEntries[i].wBitCount=pIconDirEntry[i].wBitCount;
- pGrpIconDir->idEntries[i].dwBytesInRes=pIconDirEntry[i].dwBytesInRes;
- pGrpIconDir->idEntries[i].nID=i+1; }
- hUpdate = BeginUpdateResource(lpExeName, false);
- if (hUpdate!=NULL)
- {
- HMODULE hMe= 0; // means load from this module
- if (FindResource( hMe, lpExeName, RT_GROUP_ICON))
- {
- ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(0), MAKELANGID(LANG_CHINESE, SUBLANG_SYS_DEFAULT), (LPVOID)pGrpIconDir, nGSize);
- if (!ret)
- {
- delete[] pIconDirEntry;
- delete[] pGrpIconDir;
- CloseHandle(hIconFile);
- return;
- }
- }
- for(i=0;i<header.idCount;i++)
- {
- nSize = pIconDirEntry[i].dwBytesInRes;
- dwRet=SetFilePointer(hIconFile, pIconDirEntry[i].dwImageOffset, NULL, FILE_BEGIN);
- if (dwRet==INVALID_SET_FILE_POINTER)
- {
- break;
- }
- delete[] pIconBytes;
- pIconBytes = new BYTE[nSize];
- ZeroMemory(pIconBytes, nSize);
- ret = ReadFile(hIconFile, (LPVOID)pIconBytes, nSize, &dwReserved, NULL);
- if(!ret)
- {
- break;
- }
- ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(pGrpIconDir->idEntries[i].nID), MAKELANGID(LANG_CHINESE, SUBLANG_SYS_DEFAULT), (LPVOID)pIconBytes, nSize);
- if(!ret)
- {
- break;
- }
- }
- if (pIconBytes!=NULL)
- {
- delete[] pIconBytes;
- }
- EndUpdateResource(hUpdate, false);
- }
- //SAFE_ARRAY_DELETE(pGrpIconDir);
- //SAFE_ARRAY_DELETE(pIconDirEntry);
- CloseHandle(hIconFile);
- */
- }
Advertisement
Add Comment
Please, Sign In to add comment