На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Изменение, добавление и удаление ресурсов
    Как программно добавить (удалить, править) ресурсы в уже скомпиленном экзешнике?
    ____________Oooo__
    ____oooO___(___)__
    ___(___)_____)_/___
    ____\_(_____(_/____
    _____\_)___________
      Функция UpdateResource. При этом надо помнить что эта функция не работает под OC 9х, только под NT и выше.
      Не хотите, чтоб вам врали - не задавайте лишних вопросов.
        Я помню, Codemaster боролся с этим, были проблемы ( иконка не менялась ).
        Вопрос к Codemaster : чем всё закончилось, поделись результатами, пожалуйста.
        А то и в FAQ можно выложить - тема повторяющаяся.
        Как жаль, что в нашей жизни нет операции «Undo»…
          Цитата Mik, 26.03.03, 14:47:17

          А то и в FAQ можно выложить - тема повторяющаяся.

          Полностью согласен...
          #define true ((rand() % 2) ? true : false) // с первым апреля с*ки!
            Я так на это и забил и всё ещё заинтересован. Кто имеет работающий код замены иконки - буду признателен.
            старый дряхлый Диззи...
              А вот только что я попробовал - наскоряк - и получилось:

              BOOL ReplaceIcon(char* szModuleName)
              {
                   
                   if ( !szModuleName ) return FALSE;
                   

                   HMODULE hDLLModule = LoadLibrary(szModuleName);
                   if ( !hDLLModule ) return FALSE;



                   HRSRC hRes = FindResource( hDLLModule, "#1", RT_ICON);
                   if ( !hRes ) return FALSE;

                   
                   HGLOBAL hG = LoadResource(hDLLModule, hRes);
                   if ( !hG ) return FALSE;

                   LPWORD p = (LPWORD)LockResource(hG);
                   if ( *p == 0 ) return FALSE;

                   LPBYTE buff = (LPBYTE)malloc(*p);                  
                   memcpy(buff, p, *p);


                   for (int i=50; i<60; i++ ) buff[i] = 0xff;


                   FreeLibrary(hDLLModule);

                   HANDLE hUR = BeginUpdateResource(szModuleName, FALSE);
                   if ( !hUR ) return FALSE;
               
                   BOOL bRes = UpdateResource( hUR, RT_ICON, MAKEINTRESOURCE(1),
                                                     MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
                                               buff, *((LPWORD)buff));

                   EndUpdateResource(hUR, FALSE);
                   return bRes;
              }

              Иконка "попортилась" - это видно в броузере в режиме View->Large Icons.
              Оно и понятно - я её в цикле for (int i=50; i<60; i++ ) buff[i] = 0xff;
              запортил. Факт в том, что попортил я её у exe-файла. Так что BeginUpdateResource работает.
              Как жаль, что в нашей жизни нет операции «Undo»…
                Если не лень, напиши копирование значка одного EXE файла в другой. Мне это надо ;-)!
                старый дряхлый Диззи...
                  Вот что я написал и не работает:

                  ExpandedWrap disabled
                    <br>BOOL CInstPropertyPage2::ReplaceIcon(LPCSTR pszResult, LPCSTR pszSource)<br>{<br>      HRSRC hResLoad;     // handle to loaded resource <br>      HINSTANCE hExe;        // handle to existing .EXE file <br>      HRSRC hRes;         // handle/ptr. to res. info. in hExe <br>      HANDLE hUpdateRes;  // update resource handle <br>      char *lpResLock;    // pointer to resource data <br>      BOOL result; <br>      <br>      // Load the .EXE file that contains the icon you want to copy. <br>      hExe = LoadLibrary(pszSource); <br><br>      if (hExe == NULL) <br>      { <br>            return FALSE;<br>      }<br><br>      UINT nIconID; // only IDs<br><br>      if(! EnumResourceNames(hExe, RT_ICON, (ENUMRESNAMEPROC) _EnumResNameProc, (LONG) &nIconID))<br>      {<br>            return FALSE;<br>      }<br>      <br>      // Locate the dialog box resource in the .EXE file. <br>      hRes = FindResource(hExe, MAKEINTRESOURCE(nIconID), RT_ICON); <br>      if (hRes == NULL) <br>      { <br>            return FALSE;<br>      } <br>      <br>      // Load the dialog box into global memory. <br>      hResLoad = (HRSRC) LoadResource(hExe, hRes); <br><br>      if (hResLoad == NULL) <br>      { <br>            return FALSE;<br>      }<br><br>      // Lock the dialog box into global memory. <br>      lpResLock = (char*) LockResource(hResLoad); <br>      if (lpResLock == NULL) <br>      { <br>            return FALSE;<br>      }<br><br>      // Open the file to which you want to add the dialog box resource. <br>      <br>      hUpdateRes = BeginUpdateResource(pszResult, FALSE); <br>      <br>      if (hUpdateRes == NULL) <br>      { <br>            return FALSE;<br>      } <br>      <br>      // Add the dialog box resource to the update list. <br>      result = UpdateResource(hUpdateRes,       // update resource handle <br>            RT_ICON,                   // change dialog box resource <br>            MAKEINTRESOURCE(100),                  // dialog box name <br>            MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),  // neutral language<br>            lpResLock,                   // ptr to resource info <br>            SizeofResource(hExe, hRes)); // size of resource info.<br>      <br>      if (result == FALSE) <br>      { <br>            return FALSE;<br>      } <br>      <br>      // Write changes to FOOT.EXE and then close it. <br>      if (!EndUpdateResource(hUpdateRes, FALSE)) <br>      { <br>            return FALSE;<br>      }<br><br>      // Clean up. <br>      if (! FreeLibrary(hExe)) <br>      { <br>            return FALSE;<br>      }<br>      <br>      return TRUE;<br>}<br><br>
                  старый дряхлый Диззи...
                    ExpandedWrap disabled
                      <br>BOOL CALLBACK CInstPropertyPage2::_EnumResNameProc(<br>                                            HMODULE hModule,   // module handle<br>                                            LPCTSTR lpszType,  // resource type<br>                                            LPTSTR lpszName,   // resource name<br>                                            LONG_PTR lParam    // application-defined parameter<br>                                            )<br>{<br>      static UINT nIDMax = (UINT) -1;<br>      <br>      if(IS_INTRESOURCE(lpszName))<br>      {<br>            UINT nRes = LOWORD(lpszName);<br><br>            if(nRes < nIDMax)<br>            {<br>                  nIDMax = nRes;<br>                  *(UINT*)lParam = nRes;<br>                  TRACE("Icon id = \%d\n", nRes);<br>            }            <br>      }<br><br>      return  TRUE;<br>}<br>
                    старый дряхлый Диззи...
                      А в каком формате надо записывать RT_STRING (например)?
                      в описании UpdateResource сказано что в качестве буфера надо давать бинарную дату, а данные полученные с помощью LoadString не прокатывают. Так что же надо посылать в качестве буфера?
                      ____________Oooo__
                      ____oooO___(___)__
                      ___(___)_____)_/___
                      ____\_(_____(_/____
                      _____\_)___________
                        Тема будет на верху некое время :) Так надо! :)
                        #define true ((rand() % 2) ? true : false) // с первым апреля с*ки!
                          Народ! хочу переключить вашу исследовательско-отладческую энергию в другое русло :) : вот тут http://www.codeguru.com/misc/resources.html лежат сырцы, как раз позволяющие под любой ОС заменить ресурсы. Только вот как я не бился - не работает у меня эта бодяга :(
                          отладим вместе! :)
                            Хе, я гляну.
                            старый дряхлый Диззи...
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script Execution time: 0,1565 ]   [ 17 queries used ]   [ Generated: 26.06.19, 02:00 GMT ]