WetCode

Untitled

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