Изменение иконки exe файла.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ShkiperLol, 17 Jun 2010.

  1. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Нужно програмно изменить иконку exe файла,на иконку которая находиться в ресурсах приложения которое будет изменять.
    Написал такой код,но почемуто стандартная икона не меняеться на нужную мне.
    В чем может быть проблема?
    Code:
    int main(int argc, char* argv[])
    {
     HRSRC find=FindResourceA(0,"ICO","RT_ICON");
      if(find)
       {
         HGLOBAL glob=LoadResource(0,find);
          if(glob)
           {
             LPVOID lock=LockResource(glob);
              if(lock)
               {
                  HANDLE update=BeginUpdateResource("ip.exe",false);
                     if(update)
                       {
                         BOOL up=UpdateResource(update,"Иконка","MAINICON",NULL,lock,SizeofResource(0,find));
                         EndUpdateResourceA(update,false);
                       }
               }
           }
       }
            return 0;
    }
    
     
  2. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Чтобы изменить ресурсы, нужно открыть файл на запись а он у тебя запущен.
     
  3. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Но он то в ресурсы пишеться,просто пишеться не так как нада.В ресурсах файла есть "Иконка",так вот заместь того чтобы переписать ее ,создаеться еще одна "Иконка"
     
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    а ты тут не пробовал читать?

    http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx#_win32_Updating_Resources
     
    _________________________
  5. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Те же самые функции я использую в совем коде.
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    *WALL* молодец... только не в том порядке... ты даже на загружаешь файл куда хочешь внести изменения...

    хотя вроде правильно... единственное чтобы изменить ресурс ты должен знать точный его индификтор (номер) в файле ip.exe
     
    _________________________
    #6 Gar|k, 17 Jun 2010
    Last edited: 17 Jun 2010
  7. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    А какой функцией его можна узнать?
     
  8. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    редактором ресурсов руками
     
  9. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    учись читать MSDN
    http://msdn.microsoft.com/en-us/library/ms648005(v=VS.85).aspx - перечисление ресурсов
    я думаю тебе пойдет вот эта функция EnumResourceNames c типом RC_ICON

    1 делаешь

    HMODULE hExe = LoadLibrary(TEXT("ip.exe"));
    if (hExe == NULL) return -1;

    2 EnumResourceNames почитай тут кароче
    http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx#_win32_Creating_a_Resource_List
    там все примеры

    в общем получив имя ресурса или его id в случае если IS_INTRESOURCE
    ты уже можешь вызвать UpdateResource

    // Open the file to which you want to add the dialog box resource.
    hUpdateRes = BeginUpdateResource(TEXT("foot.exe"), FALSE);
    if (hUpdateRes == NULL)
    {
    ErrorHandler(TEXT("Could not open file for writing."));
    return;
    }

    // Add the dialog box resource to the update list.
    result = UpdateResource(hUpdateRes, // update resource handle
    RT_DIALOG, // change dialog box resource
    MAKEINTRESOURCE(IDD_FOOT_ABOUTBOX), // dialog box id
    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language
    lpResLock, // ptr to resource info
    SizeofResource(hExe, hRes)); // size of resource info

    где MAKEINTRESOURCE(IDD_FOOT_ABOUTBOX) это как раз имя найденого ресурса lpName которое в функции EnumNamesFunc

    ------------
    кароче мне лень запускать VS )))
     
    _________________________
  10. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще ты не имеешь право менять ресурсы у себяже потому что это вызовет сбой. Зато ты можеш сделать копию своейже проги и у неё менять ресурс.

    А вообще чтобы забрать ресурс из чужой проги/dll нельзя юзать LoadLibrary (т.е. можно но это неправильно и хавает больше ресурсов) Для таких целей юзается LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE. Потому как гласит MS
     
    #10 slesh, 17 Jun 2010
    Last edited: 17 Jun 2010
  11. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Вы вобще читали мой первый пост?
    Я не пытаюсь менять ресурсы у себя,я хочю изменить ресурс(иконку)у другого приложения!