Конференция "WinAPI" » Как заменить иконку? [D6, WinXP]
 
  • Artem (23.01.08 22:01) [0]
    Коллеги, помогите решить следующую задачу.

    В моей программе в файле ресурсов (library.res) находится иконка. Компилировался он следующим образом:

    i1 RT_ICON i1.ico



    Вопрос в следующем: как заменить иконку другого приложения на ту, что находится в моей программе в файле ресурсов ("i1")?

    Нашел процедуру и подправил ее под свои задачи, но не получается. В чем ошибка? Код такой:

    procedure Changeicon(const EXEFileName:string;ResName:PChar);
    var
     hExe, hResLoad, hUpdateRes, hRes: THandle;
     lpResLock: PChar;
     result: Boolean;
     S, SS: String;

    begin

    S:=paramstr(0);

    hExe:=LoadLibrary(PChar(S));    
     if (hExe=0) then ShowMessage('Could not load exe.');

     hRes:=FindResource(hExe, Pchar(ResName), RT_ICON);  
     if (hRes=0) then ShowMessage('Could not locate resource.');

     hResLoad:=LoadResource(hExe, hRes);
     if (hResLoad=0) then ShowMessage('Could not load icon.');

     lpResLock:=LockResource(hRes);    
     if (lpResLock=nil) then ShowMessage('Could not lock icon.');

     SS:=EXEFileName;
     hUpdateRes:=BeginUpdateResource(PChar(SS), TRUE);
     if (hUpdateRes=0) then ShowMessage('Could not open file for writing.');

     result:=UpdateResource(hUpdateRes,      // update resource handle
               RT_ICON,                  // change dialog box resource
               PChar(1),                  // icon name
               LANG_NEUTRAL,
               lpResLock,                  // ptr to resource info
               SizeofResource(hExe, hRes)); // size of resource info.
     if result=False then ShowMessage('Could not add resource.');

     EndUpdateResource(hUpdateRes, FALSE);

     FreeLibrary(hExe);

    end;



    Использую процедуру так:
    ChangeIcon('c:\program.exe',Pchar('i1'));



    Ошибка начинается с
    hExe:=LoadLibrary(PChar(S));    
     if (hExe=0) then ShowMessage('Could not load exe.');



    Нужна Ваша помощь. Заранее благодарю участников дискуссии.
  • Сергей М. © (23.01.08 22:21) [1]

    > Ошибка начинается с


    Что, прямо так и говорит, мол, "я, ошибка, начинаюсь с" ?
  • Artem (23.01.08 22:31) [2]
    Указанное имя ресурса не найде в файле образа говорит
  • Artem (23.01.08 22:49) [3]
    Файл образа - это ресурс в программе, в которой изменяется иконка в данном случае?
  • Сергей М. © (23.01.08 22:55) [4]

    > Указанное имя ресурса не найде в файле образа говорит


    Врешь бессовестно.

    "Could not load exe"  переводится совсем иначе.
  • Leonid Troyanovsky © (23.01.08 22:57) [5]

    > Artem   (23.01.08 22:01)  

    > Вопрос в следующем: как заменить иконку другого приложения

    SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)

    --
    Regards, LVT.
  • Artem (23.01.08 22:57) [6]
    RaiseLastWin32Error() говорит
  • Artem (23.01.08 23:01) [7]

    > SendMessage(wnd, WM_SETICON, 1, AIcon.Handle)


    wnd - это путь к программе, в которой необходимо изменить иконку?
  • Сергей М. © (23.01.08 23:03) [8]

    > RaiseLastWin32Error() говорит


    Начинаются интимные подробности)

    В приведенном изначально коде нет никаких "RaiseLastWin32Error", однако "оно" что-то там говорит, причем неизвестно что)
  • Artem (23.01.08 23:04) [9]
    язаменил ShowMessage на RaiseLastWin32Error()
  • Сергей М. © (23.01.08 23:08) [10]

    > аменил ShowMessage на RaiseLastWin32Error()


    Малацца.

    И что же говорит RaiseLastWin32Error ?

    Стесняюсь спросить - неужели "'Could not load exe" ?)
  • Artem (24.01.08 00:07) [11]
    Повторяю: Указанное имя ресурса не найдено в файле образа
  • Сергей М. © (24.01.08 00:12) [12]
    Тогда ты врешь здесь


    > Ошибка начинается с hExe:=LoadLibrary(PChar(S));


    Вызов ф-ции LoadLibrary() не может вернуть такую ошибку.
  • Artem (24.01.08 00:21) [13]
    Я не знаю в чем ошибка, поэтому и обратился за помощью.
  • Сергей М. © (24.01.08 00:42) [14]

    >  не знаю в чем ошибка


    Но при этом ничтоже сумняшеся утверждаешь, что ошибка начинается при выполнении такой-то конкретной строки, а именно LoadLibrary ?
  • Artem (24.01.08 00:46) [15]
    Я так утверждал, потому что первое сообщение, которое появлялось было именно 'Could not load exe', а потом все остальные подряд...
  • Сергей М. © (24.01.08 01:30) [16]

    > потому что первое сообщение, которое появлялось было именно
    > 'Could not load exe'


    Если библиотека не была загружена (о чем, собственно, и говорит сообщение 'Could not load exe'), то дальнейший код попросту лишен смысла.

    Ты добился безошибочной загрузки библиотеки ?
  • Artem (24.01.08 01:36) [17]
    Да, добился. Но теперь "указанный тип ресурса в файле образа отсутствует". Почему?

    Я изменил:
    result:=UpdateResource(hUpdateRes,      
               PChar('ICON'),                  
               PChar('MAINICON'),                
               LANG_NEUTRAL,
               lpResLock,                  
               SizeofResource(hExe, hRes));
     if result=False then RaiseLastWin32Error();

    Все равно ругается. Я не правильно задаю тип получается? Смотрел через ResXplor данный файл. Иконка программы находится в разделе "ICON", тогда почему ошибка???
  • Сергей М. © (24.01.08 09:44) [18]
  • Artem (24.01.08 10:38) [19]
    Что писать в MakeIntResource?
    SourceIndex, DestIndex не заданы и не описаны в примере...
 
Конференция "WinAPI" » Как заменить иконку? [D6, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]