WetCode

Untitled

Dec 7th, 2013
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.86 KB | None | 0 0
  1. // .h FILE
  2.  
  3. #ifndef ICONCHANGER_H
  4. #define ICONCHANGER_H
  5.  
  6. #include <windows.h>
  7. #include <tchar.h>
  8. #include <QString>
  9.  
  10.  typedef struct tagHEADER
  11.  {
  12.      WORD idReserved;
  13.      WORD idType;
  14.      WORD idCount;
  15.  }HEADER, *LPHEADER;
  16.  
  17.  typedef struct tagICONDIRENTRY
  18.  {
  19.      BYTE bWidth;
  20.      BYTE bHeight;
  21.      BYTE bColorCount;
  22.      BYTE bReserved;
  23.      WORD wPlanes;
  24.      WORD wBitCount;
  25.      DWORD dwBytesInRes;
  26.      DWORD dwImageOffset;
  27.  }ICONDIRENTRY, *LPICONDIRENTRY;
  28.  
  29.  typedef struct tagGRPICONDIRENTRY
  30.  {
  31.      BYTE bWidth;
  32.      BYTE bHeight;
  33.      BYTE bColorCount;
  34.      BYTE bReserved;
  35.      WORD wPlanes;
  36.      WORD wBitCount;
  37.      DWORD dwBytesInRes;
  38.      WORD nID;
  39.  }GRPICONDIRENTRY, *LPGRPICONDIRENTRY;
  40.  
  41.  typedef struct tagGRPICONDIR
  42.  {
  43.      WORD idReserved;
  44.      WORD idType;
  45.      WORD idCount;
  46.      GRPICONDIRENTRY idEntries[1];
  47.  }GRPICONDIR, *LPGRPICONDIR;
  48.  
  49. class IconChanger {
  50.  
  51. public:
  52.  
  53.     // Members
  54.     HRSRC hrResSource;
  55.     HMODULE hExeSource;
  56.     HGLOBAL hGlobSource;
  57.  
  58.     char *cFilePathSource;
  59.     DWORD dwSizeOfSource;
  60.     char* lpIconBuffer;
  61.  
  62.     int nIconCount;
  63.  
  64.     // Methods
  65.     IconChanger();
  66.     ~IconChanger();
  67.  
  68.     void GetIconFromSource(QString sIconPath, QString sExePath);
  69.     void ChangeExeIcon(LPCTSTR lpIconFile, LPCTSTR lpExeName);
  70. private:
  71.  
  72.  
  73. };
  74.  
  75. #endif // ICONCHANGER_H
  76.  
  77.  
  78. // .CPP FILE
  79.  
  80. #include "IconChanger.h"
  81. #include <iostream>
  82. using namespace std;
  83. #include <QMessageBox>
  84. #include <QDebug>
  85.  
  86. BOOL ResNames(HMODULE hModule, LPCTSTR lpType, LPTSTR lpName, LONG lParam)
  87. {
  88.     if (!IS_INTRESOURCE(lpName))
  89.     {
  90.        // cout << "Not int resource NAMES" << endl;
  91.        // cout << "TYPE in Names: " << lpType << endl;
  92.         //cout << "NAME in Names: " << lpName << endl;
  93.  
  94.     } else {
  95. //        cout << "is int resource. NAMES" << endl;
  96. //        cout << "TYPE in Names: " << (long)lpType << endl;
  97. //        cout << "NAME in Names: " << (long)lpName << endl;
  98.  
  99.         if ( lpType == RT_ICON )
  100.         {
  101.             char *cFilePath = new char[MAX_PATH];
  102.             GetModuleFileName( hModule, cFilePath, MAX_PATH);
  103.  
  104.  
  105.             HANDLE hCleanExe = NULL;
  106.             hCleanExe = BeginUpdateResource(cFilePath, FALSE);
  107.             if ( hCleanExe == NULL )
  108.             {
  109.                 QMessageBox mess;
  110.                 mess.setText(QString("Begin Clean Up FAILED! - ").append(QString::number(GetLastError())));
  111.                 mess.exec();
  112.                 return FALSE;
  113.             }
  114.  
  115.             if ( !UpdateResource( hCleanExe, lpType, lpName, MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL), NULL, 0) )
  116.             {
  117.                 QMessageBox mess;
  118.                 mess.setText(QString("Cleaning Update FAILED! - ").append(QString::number(GetLastError())));
  119.                 mess.exec();
  120.                 return FALSE;
  121.             }
  122.  
  123.             if ( !EndUpdateResource( hCleanExe, FALSE) )
  124.             {
  125.                 QMessageBox mess;
  126.                 mess.setText(QString("End Cleanup FAILED! - ").append(QString::number(GetLastError())));
  127.                 mess.exec();
  128.                 return FALSE;
  129.             }
  130.         }
  131.  
  132.     }
  133.  
  134.    return TRUE;
  135. }
  136.  
  137. BOOL ResTypes(HMODULE hModule, LPTSTR lpType, LONG lParam)
  138. {
  139.     if (!IS_INTRESOURCE(lpType))
  140.     {
  141. //        cout << "INT is not resource TYPE" << endl;
  142. //        cout << "TYPE:" << lpType << endl;
  143.         if ( lpType == (RT_ICON + 11) )
  144.         {
  145.             EnumResourceNames(hModule, lpType, (ENUMRESNAMEPROC)ResNames, 0);
  146.         }
  147.  
  148.     } else {
  149. //        cout << "INT is resource TYPE" << endl;
  150. //        cout << "TYPE:" << (long)lpType << endl;
  151.         if ( lpType == (RT_ICON + 11) )
  152.         {
  153.             EnumResourceNames(hModule, lpType, (ENUMRESNAMEPROC)ResNames, 0);
  154.         }
  155.     }
  156.  
  157.    return true;
  158. }
  159.  
  160.  
  161. IconChanger::IconChanger() // Constructor
  162. {
  163.     hExeSource = NULL;
  164.     hrResSource = NULL;
  165.     hGlobSource = NULL;
  166.     lpIconBuffer = NULL;
  167. }
  168.                                                             // Retrive Icon Buffer
  169. void IconChanger::GetIconFromSource(QString sIconPath, QString sExePath) // from source Exe/DLL
  170. {
  171.     LPICONDIRENTRY pIconDirEntry(NULL);
  172.     LPGRPICONDIR pGrpIconDir(NULL);
  173.     HEADER header;
  174.     LPBYTE pIconBytes(NULL);
  175.     HANDLE hIconFile(NULL);
  176.     DWORD dwRet(0), nSize(0), nGSize(0), dwReserved(0);
  177.     HANDLE hUpdate(NULL);
  178.     BOOL ret(FALSE);
  179.     WORD i(0);
  180.     //sIconPath.replace("\\", "\\\\", Qt::CaseSensitive);
  181.    // sExePath.replace("\\", "\\\\", Qt::CaseSensitive);
  182.  
  183.     hExeSource = LoadLibrary( sExePath.toStdString().c_str() );
  184.     if ( hExeSource == NULL )
  185.     {
  186.         QMessageBox mess; mess.setText("Unable to get handle to EXE/DLL\n" + sExePath );
  187.         mess.exec();
  188.     }
  189.  
  190.     hIconFile = CreateFile( sIconPath.toStdString().c_str(), GENERIC_READ,
  191.                             0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  192.     if ( hIconFile == INVALID_HANDLE_VALUE )
  193.     {
  194.         QMessageBox mess; mess.setText("Unable to open file.\n" + sIconPath );
  195.         mess.exec();
  196.     }
  197.  
  198.     ret = ReadFile( hIconFile, &header, sizeof(HEADER), &dwReserved, NULL );
  199.     if (!ret)
  200.     {
  201.         CloseHandle(hExeSource);
  202.         QMessageBox mess; mess.setText("Unable to Read Icon File " + sIconPath );
  203.         mess.exec();
  204.         return;
  205.     }
  206.  
  207.     pIconDirEntry = (LPICONDIRENTRY)new BYTE[ header.idCount * sizeof(ICONDIRENTRY) ];
  208.     if ( pIconDirEntry == NULL )
  209.     {
  210.         CloseHandle(hIconFile);
  211.         QMessageBox mess; mess.setText("Unable to allocate memory for Icon Group Header" + sIconPath );
  212.         mess.exec();
  213.         return;
  214.     }
  215.  
  216.     ret = ReadFile(hIconFile, pIconDirEntry, header.idCount*sizeof(ICONDIRENTRY), &dwReserved, NULL);
  217.     if (!ret)
  218.     {
  219.         delete[] pIconDirEntry;
  220.         CloseHandle(hIconFile);
  221.         QMessageBox mess; mess.setText("Unable to read Icon Dir Entrys" + sIconPath );
  222.         mess.exec();
  223.         return;
  224.     }
  225.  
  226.     nGSize = sizeof(GRPICONDIR)+header.idCount*sizeof(ICONDIRENTRY);
  227.     pGrpIconDir = (LPGRPICONDIR)new BYTE[nGSize];
  228.     ZeroMemory( pGrpIconDir, nSize );
  229.  
  230.     pGrpIconDir->idReserved = header.idReserved;
  231.     pGrpIconDir->idType = header.idType;
  232.     pGrpIconDir->idCount = header.idCount;
  233.  
  234.    // nIconCount = 0;
  235.  
  236.     for ( i = 0; i < header.idCount; i++ )
  237.     {
  238.         pGrpIconDir->idEntries[i].bWidth = pIconDirEntry[i].bWidth;
  239.         pGrpIconDir->idEntries[i].bHeight = pIconDirEntry[i].bHeight;
  240.         pGrpIconDir->idEntries[i].bColorCount = pIconDirEntry[i].bColorCount;
  241.         pGrpIconDir->idEntries[i].bReserved = pIconDirEntry[i].bReserved;
  242.         pGrpIconDir->idEntries[i].wPlanes = pIconDirEntry[i].wPlanes;
  243.         pGrpIconDir->idEntries[i].wBitCount = pIconDirEntry[i].wBitCount;
  244.         pGrpIconDir->idEntries[i].dwBytesInRes = pIconDirEntry[i].dwBytesInRes;
  245.         pGrpIconDir->idEntries[i].nID = i+1;
  246.     }
  247.  
  248.     EnumResourceTypes( hExeSource, (ENUMRESTYPEPROC)ResTypes, 0);
  249.     cout << "Done. " << endl;
  250.     CloseHandle(hIconFile);
  251.     FreeLibrary(hExeSource);
  252. }
  253.  
  254. IconChanger::~IconChanger() // De-Constructor
  255. {
  256.  
  257. }
  258.  
  259. void IconChanger::ChangeExeIcon(LPCTSTR lpIconFile, LPCTSTR lpExeName)
  260. {
  261.     /*
  262.      LPICONDIRENTRY pIconDirEntry(NULL);
  263.      LPGRPICONDIR pGrpIconDir(NULL);
  264.      HEADER header;
  265.      LPBYTE pIconBytes(NULL);
  266.      HANDLE hIconFile(NULL);
  267.      DWORD dwRet(0), nSize(0), nGSize(0), dwReserved(0);
  268.      HANDLE hUpdate(NULL);
  269.      BOOL ret(FALSE);
  270.      WORD i(0);
  271.  
  272.      pGrpIconDir->idReserved=header.idReserved;
  273.      pGrpIconDir->idType=header.idType;
  274.      pGrpIconDir->idCount=header.idCount;
  275.  
  276.      for(i=0;i<header.idCount;i++)
  277.      {
  278.          pGrpIconDir->idEntries[i].bWidth=pIconDirEntry[i].bWidth;
  279.          pGrpIconDir->idEntries[i].bHeight=pIconDirEntry[i].bHeight;
  280.          pGrpIconDir->idEntries[i].bColorCount=pIconDirEntry[i].bColorCount;
  281.          pGrpIconDir->idEntries[i].bReserved=pIconDirEntry[i].bReserved;
  282.          pGrpIconDir->idEntries[i].wPlanes=pIconDirEntry[i].wPlanes;
  283.          pGrpIconDir->idEntries[i].wBitCount=pIconDirEntry[i].wBitCount;
  284.          pGrpIconDir->idEntries[i].dwBytesInRes=pIconDirEntry[i].dwBytesInRes;
  285.          pGrpIconDir->idEntries[i].nID=i+1;        }
  286.  
  287.      hUpdate = BeginUpdateResource(lpExeName, false);
  288.      if (hUpdate!=NULL)
  289.      {
  290.          HMODULE hMe= 0; // means load from this module
  291.  
  292.          if (FindResource( hMe, lpExeName, RT_GROUP_ICON))
  293.          {
  294.  
  295.              ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(0), MAKELANGID(LANG_CHINESE, SUBLANG_SYS_DEFAULT), (LPVOID)pGrpIconDir, nGSize);
  296.              if (!ret)
  297.              {
  298.                  delete[] pIconDirEntry;
  299.                  delete[] pGrpIconDir;
  300.                  CloseHandle(hIconFile);
  301.                  return;
  302.              }
  303.          }
  304.  
  305.  
  306.          for(i=0;i<header.idCount;i++)
  307.          {
  308.  
  309.              nSize = pIconDirEntry[i].dwBytesInRes;
  310.  
  311.              dwRet=SetFilePointer(hIconFile, pIconDirEntry[i].dwImageOffset, NULL, FILE_BEGIN);
  312.              if (dwRet==INVALID_SET_FILE_POINTER)
  313.              {
  314.                  break;
  315.              }
  316.  
  317.              delete[] pIconBytes;
  318.  
  319.              pIconBytes = new BYTE[nSize];
  320.              ZeroMemory(pIconBytes, nSize);
  321.              ret = ReadFile(hIconFile, (LPVOID)pIconBytes, nSize, &dwReserved, NULL);
  322.              if(!ret)
  323.              {
  324.                  break;
  325.              }
  326.  
  327.              ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(pGrpIconDir->idEntries[i].nID), MAKELANGID(LANG_CHINESE, SUBLANG_SYS_DEFAULT), (LPVOID)pIconBytes, nSize);
  328.              if(!ret)
  329.              {
  330.                  break;
  331.              }
  332.          }
  333.  
  334.          if (pIconBytes!=NULL)
  335.          {
  336.             delete[] pIconBytes;
  337.          }
  338.  
  339.          EndUpdateResource(hUpdate, false);
  340.      }
  341.  
  342.  
  343.      //SAFE_ARRAY_DELETE(pGrpIconDir);
  344.      //SAFE_ARRAY_DELETE(pIconDirEntry);
  345.      CloseHandle(hIconFile);
  346.  
  347.      */
  348.  }
Advertisement
Add Comment
Please, Sign In to add comment