Скачать: shimgvw_xp32.7z (включает бинарник и исходный код лаунчера, плюс shimgvw.dll из англоязычной Windows XP SP3).
Как это было сделано?
Стандартный просмотрщик картинок в Windows XP — это не обычное приложение. Он находится в библиотеке shimgvw.dll, и запустить его напрямую нельзя — нужен как минимум rundll32 (указание пути к существующему файлу картинки обязательно):
rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif
Но этот трюк не срабатывает на Windows 7 и новее — shimgvw.dll не может загрузиться, ему для корректной работы нужен режим совместимости с Windows XP. Этого можно добиться, установив соответствующий режим совместимости для копии rundll32, но совместимость с XP подразумевает под собой повышение прав приложения до максимальных, что вызывает появление диалога UAC при каждом запуске, чего хотелось бы избежать.
Небольшой танец с отладчиком позволил выяснить причину — в процессе загрузки shimgvw.dll впоследствии пытается импортировать несколько функций из shunimpl.dll, где хранятся устаревшие функции оболочки, и последняя по умолчанию отказывается загружаться, если ATOM «FailObsoleteShellAPIs» отсутствует (наличие этого ATOM разрешает загрузку библиотеки, но тогда все устаревшие функции просто возвращают код с ошибкой). Режим совместимости с XP, помимо прочего, устанавливает этот ATOM, поэтому просмотрщик и запускается.
Было решено написать небольшой лоадер, который добавляет ATOM «FailObsoleteShellAPIs», спрашивает какую картинку открыть (если в параметрах не был передан путь), и дальше передаёт управление в shimgvw.dll. Просмотрщик работает нормально (т.е. изначальная задача была выполнена), так что я не стал исследовать, что же за устаревшие функции импортируются из shunimpl.dll и в каких случаях они используются — видимо, ничего критичного для работы просмотрщика они не делают.
Поскольку для реализации лоадера не нужно ничего кроме небольшого числа функций WinAPI, я решил в качестве эксперимента собрать проект при помощи Clang без использования рантайма (ранее я всегда использовал MSVC для таких танцев). Таким образом, получился исполняемый файл размером 14 килобайт, из которых 9 килобайт ушло на иконку. Если кому-то также нравится делать мини-приложения без зависимостей от нестандартных библиотек — данный проект может послужить небольшим примером, как это делается при помощи Clang.
Комментарии (81)
dartraiden
19.11.2018 18:58+2Давно пользуюсь, реализовано таким же образом (с помощью shimgvw.dll)
github.com/Corgano/Windows7GifViewerVEG Автор
19.11.2018 19:26+1Мой лаунчер работает всё же иначе — rundll32 никак не используется, флаги совместимости в реестр не прописываются. shimgvw.exe (после вызова
AddAtomW(L"FailObsoleteShellAPIs")
, что влияет только на текущий процесс) загружает shimgvw.dll напрямую, и дальше управление передаётся в функциюImageView_Fullscreen
(без использования дополнительных посредников).
CoolCmd
19.11.2018 19:10+1вместо одной длинной строки
clang kernel32.lib user32.lib shell32.lib comdlg32.lib shlwapi.lib shimgvw.cpp shimgvw.res
удобнее сделать примерно так:
clang kernel32.lib user32.lib shell32.lib^ comdlg32.lib shlwapi.lib^ shimgvw.cpp shimgvw.res
r3r
19.11.2018 19:17+4Месье конечно знает толк :)
Вот делюсь своим, влезет даже на дискету и умеет в анимацию :)
ufile.io/720ck
Udavf
19.11.2018 22:09+3виснет намертво на крупных гифках (больше 2-х мб примерно)
r3r
19.11.2018 22:25Да оно наверное так и есть. Я на парочке проверил перед публикацией и было норм, только они небольшие. Это неудивительно, что повисло. Софт тогда писался другими инструментами и c другими целями. В 2000-м никто не думал, что будут в браузере смотреть видосики в гиф по 100 метров. 2 метровая гифка тогда вызывала жуткий батхерт в камментах, как bmp.
К слову сказать, это не отменяет мой правоты, что в анимацию ACDSee умеет. Просто неглубоко :)
Arris
20.11.2018 08:55Единственный минус ACDSee 2.4 (у меня такая) — она не понимает alpha-канал в PNG.
Но на такой случай есть IfranView.
igrblkv
19.11.2018 22:18Со времен 98-й Винды ещё, кажется, пользуюсь ACDSee 2.42 в качестве просмотрщика графических форматов «по-умолчанию».
Alexeyslav
20.11.2018 12:42До не такого уж и давнего времени тоже использовал ACDSee 2.42 но пришлось отказаться. Проблема… если включить показ превьюшек(а какой тогда смысл от программы без них?) создается база всех превьюшек и никогда не очищается, все просмотренные изображения туда падают… и когда дело доходит до размера примерно в 800мБ приложение мгновенно падает при запуске.
Алес капут. Запарился удалять эту базу, перешел на FastStone. Работает даже быстрее… поддерживает больше форматов в том числе RAW… но… блин, опять те же грабли? База превьюшек разрастается до количества сохраненных папок больше 1000 и превьюшки перестают отображаться. Тут хотябы есть штатный механизм очистки базы. Надеюсь пофиксят.igrblkv
20.11.2018 22:16Превьюшки (эскизы) может и Експлорер генерировать и показывать.
Если надо крупнее (на весь экран) — Ентер (или клик мышкой) и открывается ACDSee.Alexeyslav
21.11.2018 09:24А смысл тогда эксплорера, если можно сразу ACDSee открыть и все операции проводить там?
alexanster
19.11.2018 20:31+3Вау. Теперь осталось ещё explorer.exe из XP запустить на 7-8-10 для полной аутентичности и никакие classicshell-ы не нужны будут ;)
VEG Автор
20.11.2018 01:36+1Я сразу как перешёл с Windows XP на Windows 7, баловался таким. На самом деле, explorer.exe из XP достаточно легко запускался на семёрке, но работало оно ожидаемо отвратительно, с кучей проблем. Потом при помощи 7 Taskbar Tweaker настроил новый таскбар даже лучше, чем было; при помощи Classic Shell вернул нормальную кнопку Back — и тогда запуск старого explorer потерял актуальность.
FeNUMe
19.11.2018 23:10Один вопрос: зачем? Я понимаю желание избавиться от говно-просмотрщика в десятке, но это ведь делается простой правкой реестра или для ленивых одной галочкой в любом твикере(dws, w10privacy и т.д.) — вернется вполне нормальный вьювер из 7ки.
Вообще из всех просмотрщиков мне больше всего нравился встроенный в Google Picasa и кто-то его даже выдирал в отдельное приложение, но после этого он фигово интегрировался в последние версии винды. Пришлось перейти на JPEGView — тоже мелкий и шустрый.VEG Автор
20.11.2018 01:15Если бы вы ознакомились бы с первом абзацем, то вы бы узнали, что:
— Стандартный просмотрщик картинок Windows 7 не понимает GIF-анимацию.
— Старый просмотрщик в моём случае используется не на постоянной основе, а для ностальгических целей (просмотр архива старых картинок, где есть в том числе и старые анимированные гифки).
Просмотрщик картинок из Windows XP лично мне не подходит для использования на постоянной основе, так как он не умеет показывать HEIC-файлы (которые с лёгкой руки Apple приобрели некоторую популярность), и использовать WIC-кодеки он не умеет (что могло бы исправить ситуацию). Ну а инвестировать тонну времени в серьёзную доработку старого просмотрщика я не готов — я не настолько его фанат =) Если уж и заводить речь о патчинге стандартного просмотрщика, то я скорее тогда двигался бы в направлении добавления поддержки анимации в стандартный просмотрщик из Windows 7.
vesper-bot
20.11.2018 09:09Ещё семерочный вьювер иногда не печатает jpg от слова совсем, и не лечится ничем в этом случае (куда-то срет в профиль, потом тупит, и всё от того, что использует несистемный диалог печати, типа умный). ХРшный использует системные ресурсы для печати, и это хорошо.
Ca5per
19.11.2018 23:47Тоже пользуюсь просмотрщиком из XP, пробовал разные просмотрщики, но ничего удобнее стандартного не нашел. К сожалению, у него есть проблема, он медленно воспроизводит гифки.
Наверное нужно пилить клон, с плавным воспроизведением gif и поддержкой всяких современных форматов (apng и т.д.).
x86corez
20.11.2018 00:24+1Забавное совпадение, но совсем недавно в ReactOS была добавлена поддержка анимационных GIFок в стандартный просмотрщик изображений.
Коммиты: раз, два (кстати, один из них мой)
Приложение будет доступно в следующей версии ReactOS 0.4.11, но скачать можно уже сейчас из ночных сборок, либо собрать из исходников. :)zanac
20.11.2018 10:20-2Дрова на новое железо добавляйте, блин. Фигнёй всякой занимаются, лишь бы проект нормально не развивался!
VEG Автор
20.11.2018 10:35Проект пишут энтузиасты, и занимаются они в первую очередь тем, что им интересно. Не всем интересно заниматься драйверами.
x86corez
20.11.2018 14:49Каждый из разработчиков и сторонних волонтёров проекта вносит вклад в пределах своих знаний и возможностей, писать драйверы крайне не просто.
Am0ralist
20.11.2018 10:29А софт под ReactOS будет работать на винде? )
VEG Автор
20.11.2018 10:36Должен, ведь обе ОС реализуют тот же Win32 API. Раньше, когда я игрался с этой ОС, софт из состава ReactOS без проблем запускался на Windows.
Am0ralist
21.11.2018 11:19Вообще это была полушутка о том, что в эпоху вин10 можно попробовать раскрутить часть программ от реакта как альтернативу встроенным в винду)
megapro17
20.11.2018 01:36Прекрасная идея! Предлагаю ещё запустить приложение ножницы SnippingTool.exe, версию для 10 запустить на 7. На 10 у неё намного больший функционал.
Temtaime
20.11.2018 02:08+1Может, кому-нибудь окажется полезным: пользуюсь со времён Windows XP просмотрщиком XNView.
Rast1234
20.11.2018 12:14Только сейчас стоит пользоваться XnviewMP, оригинальный на современных системах сходит с ума от нелатинских символов в путях.
Revertis
20.11.2018 14:08Когда меня окончательно задолбало приложение Фото из Вынь10, я решил попробовать несколько просмотрщиков. XnViewMP мне понравился, но дичайше тормозил при обычном запуске дабл-кликом по файлу картинки. Поставил IrfanView и офигел — грузится и показывает мгновенно.
toxicdream
20.11.2018 07:28Стесняюсь спросить, чем не понравился IrfanView.
Похож местами на XNView и ACDSee, но мне нравится его шустрость, легковесность, всеядность и расширяемость плагинами.VEG Автор
20.11.2018 11:16Он у меня тоже есть. И познакомился я с ним ещё до того, как XP появилась на свет (и с тех пор, кажется, он совсем не изменился в интерфейсе). Но прижился он у меня только для каких-то специальных случаев, когда нужно посмотреть картинку в каком-то нестандартном формате.
Alexeyslav
20.11.2018 12:56Фича из-за которой я долго сидел на ACDSee заключалась в том что ОН ЗАПОМИНАЛ с какой папки ты пришел смотреть фото и возвращал назад правильно позиционируя курсор в дереве а не заново перечитывал каталог и устанавливал курсор на первую папку по любому поводу и это дико бесило в других просмотрщиках(даже в ACDSee более свежих версий!). Как с этим обстоят дела в современном IrfanView, XNView? Встроены ли в них средства быстрой работы с изображениями — яркость подкрутить элементарно, вырезать кусочек изображения и сохранить БЕЗ ПЕРЕСЖАТИЯ, быстро сделать пакетный ресайз? так сказать не отходя от кассы… поэтому теперь использую FastStone.
Scrayer
20.11.2018 08:06Абсолютно серьезно спрашиваю: зачем нужно смотреть картинки (с использованием специального софта)?
Никогда не понимал зачем для этого есть столько программ?
Из того, что приходит в головуНавигация по фотографиям? Для этого есть проводник: миниатюры для удобства поиска.
Редактирование фото? Для этого есть именно редакторы: от пеинта до фотошопа.artemisia_borealis
20.11.2018 10:38Проводник по-моему неудобен.
- Во-первых, неудобно в двухмониторной конфигурации: когда на одном мониторе «библиотека», на втором смотришь;
- Во-вторых, например, фудживские RAF'ы не показывает в превью;
- В-третьих, допустим 16-bit'ные tif долго осознаёт (размер 300--600 МБ);
- В-четвёртых, толком не кэширует большие иерархии с картинками.
Сам я пользуюсь FastStone, по-моему, он офигенен.
Что касается редактирования, то у вас крайности: пейнт — никакой, фотошоп надо покупать (или красть). Для простого редактирования тот же fs подойдёт гораздо лучше пейнта.
P.S. Сам я пользуюсь для редактировния конечно же PS, но вот например на работе его уже не поставишь, да и у многих людей он не всегда есть.Alexeyslav
20.11.2018 14:08Ну как сказать, Paint.net это практически сверхлегковесный фотошоп со слоями и прочим но без плагинов.
alexanster
20.11.2018 14:18Читал комментарии и думал — неужели я буду первым, кто пользуется FastStone.
Alexeyslav
20.11.2018 17:50Я почти в час дня отметился, не первый…
alexanster
20.11.2018 18:29Alexeyslav, сегодня в 12:42
artemisia_borealis, сегодня в 10:38
Или я не понял, к чему это вы.
sasha1024
20.11.2018 13:36Для этого есть проводник: миниатюры для удобства поиска.
О_о, а кто-то на полном серьёзе пользуется explorer'ом?
Alexeyslav
20.11.2018 17:48Рыться в заботливо разложенных папках с фотографиями, среди которых есть RAW-ы а миниатюры в эксплорере — глаза сломать можно. Часто мне нужно работать только с фотографиями а в папке есть и видео и другие крайне нужные посторонние файлы, рассортировать их по фиксированным папкам всего парой кнопок. Быстро вырезать кусок из фотографии, ресайзнуть(или изменить соотношение сторон) выбранные для публикации… Причем фотошоп принципиально ставить не хочу, не нужен он для таких простых функций и как следствие слишком дорог. И да, когда-то фотошоп мне поломал ACDsee — заменил какую-то библиотеку на свежую которая использовалась плагином поддержки стандартных типов файлов ACDsee и просмотрщик падал при попытке показать превью определённых типов файлов т.е. как только откроешь папку с файлом в просмотрщике.
idelgujin
20.11.2018 09:57Я пользую Honey View. Удобно листать, гифки крутит, картинки вращает, приближает без проблем.
vitalyvitaly
20.11.2018 11:28Нет ли способа запустить Compaq Visual Fortran 6 или приложения, скомпилированные под ним, в Windows 7? Там какой-то затык с графикой, выводом окон, в Win 7 он всегда вылетает.
VEG Автор
20.11.2018 11:40Наверняка такая возможность имеется. Скорее всего проблема связана с какой-то ошибкой в коде рантайма или стандартной библиотеки, которая просто начала проявляться только на новых системах (я целый ряд таких «бомб с таймером» решил в своём патче для NFS3). Но без детального изучения вопроса точно ничего сказать нельзя.
vitalyvitaly
20.11.2018 14:59Имхо, это связано с какой-то перетасовкой видеоядра вероятно уже в Висте. Что самое печальное, перестала работать одна из коронных программ самого Microsoft (так как эта среда долго разрабатывалась самой MS). Никакие режимы совместимости там не помогают, что характерно.
Alexey2005
20.11.2018 11:56Вот ещё бы под Linux найти нормальный просмотрщик картинок… А то gpicview точно так же не поддерживает анимированные gif'ки (баг висит с 2012 года, и видимо в этом тысячелетии исправлен не будет), а всё остальное далеко позади либо по удобству, либо по функционалу. То нет функции «подогнать размер изображения под размер окна», то масштабирования (в том числе с клавиатуры по клавишам ±), то вращения, то листания с клавиатуры…
Rast1234
20.11.2018 12:20XnviewMP, хоть и кривой порт изначально виндовой смотрелки, но по соотношению фичи/баги, наименее кривой по сравнению с поделиями в разных шеллах
sasha1024
20.11.2018 13:38А чем gwenview плох?
Alexey2005
20.11.2018 14:04Невозможно листать изображения в директории при помощи клавиатуры — по крайней мере, я так и не сообразил, как это делать.
Кроме того, время от времени почему-то выдаёт глюки интерфейса, создавая окно без заголовка.sasha1024
20.11.2018 14:12Кнопки влево/вправо? Space/backspace? Или я неправильно понял, в чём проблема? (Там ещё и shortcut'ы настраивать можно, но такие однокнопочные, конечно, не всегда настраиваемы.)
Alexey2005
20.11.2018 14:42Ну вот я открываю через него jpg-файл (через файловый менеджер Double Commander, правый клик по файлу -> открыть с помощью -> gwenview). При этом в той же директории лежит ещё пачка таких же картинок, но перейти на них не получается — кнопки влево/вправо, равно как и Space/backspace, ничего не дают. В меню «Переход» пункты First/Next/Last/Previous неактивны.
sasha1024
20.11.2018 17:24Очень странно.
А какая версия и ОС?
Может, Double Commander его с какими-то странными параметрами запускает? Сделайтеfgrep -a gwenview
, когда он запущен.Alexey2005
20.11.2018 21:44fgrep ничего не показывает, просто чёрный экран (приходится прерывать по Ctrl+C). Команда
ps -eo args | grep "gwenview"
выдаёт/usr/bin/gwenview /home/alexey/2016-06-23-144236_1280x1024_scrot.png
Простой запуск из терминала никак не меняет ситуацию — всё равно листать картинки нельзя. Если запустить вообще без аргументов, просто как gwenview, то вообще ни одной картинки не удаётся открыть, выдаёт ошибку «URL cannot be listed: file:///home/alexey» при этом в терминал сыплются пачки ошибок типа «cannot talk to klauncher» и 'Request for unknown property «X-KDE-Protocol»'.
Lubuntu 16.04.5 LTS, LXDE.sasha1024
20.11.2018 22:06У Вас какой-то очень странный gwenview.Видимо, ему не хватает каких-то из KDE-шных пакетов, у меня под KUbuntu 16.04 (сейчас 18.04) работал прекрасно. (Просто наугад — у Васkio-extras
установлены?)Alexey2005
20.11.2018 22:25Да, установлены. Только что нагуглил тему на linux.org.ru, где обсуждают проблему — gwenview не работает на Ubuntu 16.04 (на KUbuntu работает), т.к. под эту систему не собирается kipi-plugins нужной версии… Проблема решается лишь частично, полного функционала всё равно не получить. В 14-й версии всё работало.
Alexeyslav
20.11.2018 17:55Файл случайно находится не на мобильном девайсе, подключенном по MTP-протоколу? Сетевая папка?
Такое бывает когда открываешь файлы с архивов, оно вроде бы происходит прозрачно но выбранный файл на момент открытия на самом деле лежит во временной папке один одинёшенек.
Jogger
20.11.2018 13:41Я не знаю кому и чем может нравится этот убогий просмотрщик. Я когда-то всерьёз заморочился выбором просмотрщика, и остановил свой выбор на FastStone Viewer. Бесплатный, удобный, быстрый. Лично мне субъективно понравился больше чем IrfanView и XnView. В старых версиях были проблемы с интернациональными символами в путях (с кирилицей нормально, с иероглифами нет) но вроде бы это уже поправили.
IRainman
20.11.2018 14:16Хм, я очень рад такому решению и сам непрочь понастальгировать, но я пользуюсь FastStone Image Viewer и во всём он меня устраивает, а единственный в нём минус это обработка дерева путей не в отдельном потоке, что приводит к тормозам при первичном открытии на больших деревьях папок или папках с большим количеством файлов.
muxa_ru
20.11.2018 15:07О, перепись старых вьюверов. :)
Проверил MyViewPad — гифаимацию он поддерживает
Bonio
20.11.2018 16:30Это просто офигенно! Я больше всего скучал по этому просмотрщику, после перехода на 7. Поставил бы его сейчас основным, но сходу обнаружилось два неприятных минуса: 1. нельзя перетаскивать масштабированное изображение мышкой; 2. В отличии от встроенного в 7, тут изображение сглаживается, хотя может кому-то это и плюс.
Ну и медленное воспроизведение гифок, как выше уже писали.
evgenWebm
20.11.2018 23:032018год… казалось бы.
А раньше трава была зеленей, давайте красить нынешнюю траву.
будущие, так сказать, двигают…
gecube
Небольшое замечание — лучше выкладывать такие вещи на github/gitlab. Сразу можно форкнуть понравившийся код и начать над ним работать. Да и возможность хранить там бинарные релизы тоже стоит того!
VEG Автор
Там всего один файл *.cpp на 100 строк кода. Если бы это было что-то побольше, с перспективой дальнейшего развития, то я конечно же завёл бы для этого отдельный репозиторий.
firk
Форкнуть код можно и без гитхабов. Вот инструкция: скачиваете архив, вносите свои правки и компилируете. Да и бинарные релизы можно хранить практически где угодно.
gbg
Ничего хорошего, кроме легкого творческого бардака, работа без системы контроля версий не приносит.
VEG Автор
Я совершенно с вами согласен. Я использую Mercurial на своей локальной машине даже для проектов, которые никогда не покидают пределы моей машины. Удобно отслеживать все изменения во всех файлах за всё время. Всегда можно найти конкретную ревизию, где появилась какая-то регрессия. Но для мини-проектов, которые реализованы за один присест, и у которых нет истории изменений (то есть это был бы просто один коммит), в этом нет необходимости. Как только у shimgvw появится перспектива быть расширенным и доработанным (то есть перспектива получения хотя бы второго коммита), я заведу репозиторий =)
sasha1024
Да, Mercurial рулит.
lizergil
Залив архив проекта на файлообменник, вы уже сделали больше действий чем размещение в репозитории.
VEG Автор
Чтобы сделать архив и загрузить его на FTP, нужно ровно две операции в файловом менеджере (архивация и копирование из одного места в другое).
Чтобы просто завести новый репозиторий на GitHub, нужно уже сделать больше телодвижений, да и ещё в браузере (что само по себе долго), потом клонировать этот репозиторий к себе на локалку (или добавлять remote в свежесозданный локально), добавить нужные файлы в индекс, потом commit, потом push… Всё это в любом случае займёт на порядок больше времени, чем просто заархивировать файлы и закинуть архив на свой сайт по FTP.