Как обновить ресурсы исполняемого файла explorer.exe через WinAPI
Пользователь столкнулся с проблемой обновления битмапа внутри исполняемого файла explorer.exe и не смог это сделать, используя WinAPI. Вопрос заключается в том, что при вызове функции UpdateResource происходит ошибка, и требуется выяснить, в чем заключается проблема.
Описание проблемы
Пользователь попытался обновить битмап внутри исполняемого файла exe, используя ресурс с именем 6801, который он увидел в Resource Hacker. Для этого был написан следующий код на Object Pascal (Delphi):
ResUpdate:=BeginUpdateResource(Pchar(szExplorer),false);
ShowMessage(SysErrorMessage(GetLastError));
if ResUpdate<>0 then
begin
FS:=TFileStream.Create(szBitmap,fmOpenRead or fmShareDenyWrite);
SetLength(thebmp,FS.Size);
dwSize:=FS.Size;
FS.ReadBuffer(thebmp[0],FS.Size);
FS.Free;
UpdateResource(ResUpdate,RT_BITMAP,MAKEINTRESOURCE(6801),LANG_SYSTEM_DEFAULT,@thebmp[0],dwSize);
EndUpdateResource(ResUpdate,false);
end;
Однако вызов UpdateResource завершается неудачей, и требуется определить, в чем заключается ошибка.
Подтвержденный ответ
В подтвержденном ответе указано, что проблема может заключаться в том, что функция BeginUpdateResource возвращает ошибку 50, что соответствует Error_Not_Supported. Пользователь пытался обновить битмап "Start orb" в Windows Explorer, что требует закрытия explorer.exe перед попыткой изменения его ресурсов.
Важные моменты
Необходимо закрыть explorer.exe перед обновлением его ресурсов.
Использование BeginUpdateResource и UpdateResource для изменения файлов, которые могут быть защищены (например, системные файлы), может быть ограничено системой.
Пример кода
// Закрыть explorer.exe перед выполнением
// ...
// Обновление ресурса
ResUpdate := BeginUpdateResource(PChar(szExplorer), False);
if ResUpdate <> 0 then
begin
// Чтение файла битмапа
FS := TFileStream.Create(szBitmap, fmOpenRead or fmShareDenyWrite);
// ...
// Обновление ресурса с идентификатором 6801
UpdateResource(ResUpdate, RT_BITMAP, MAKEINTRESOURCE(6801), LANG_SYSTEM_DEFAULT, @thebmp[0], dwSize);
// Завершение обновления ресурсов
EndUpdateResource(ResUpdate, False);
end;
// Обработка возможных ошибок
Рекомендации
Убедитесь, что explorer.exe закрыт перед попыткой обновления его ресурсов.
Проверьте, что нет других процессов, использующих explorer.exe, которые могут блокировать доступ к файлу.
Учитывайте, что системные файлы могут быть защищены от изменения, и любые изменения могут быть сброшены после обновления системы.
Заключение
Обновление ресурсов исполняемого файла explorer.exe через WinAPI возможно, но требует закрытия самого explorer.exe перед выполнением операций обновления. Важно также учитывать системные ограничения и потенциальные риски, связанные с изменением системных файлов.
Пользователь пытается обновить ресурс (битмап) исполняемого файла `explorer.exe` с помощью функций WinAPI, но сталкивается с ошибкой при вызове функции `UpdateResource`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.