Executando o visualizador de imagens do Windows XP no Windows moderno

Eu tenho um diretório com imagens antigas que coletei nos anos noventa. Eu o movo com todos os meus outros arquivos de um computador para outro a cada atualização. De vez em quando, quando me sinto um pouco nostálgico, abro e olho as fotos. Existem alguns arquivos GIF com animação e sempre que percebo que o visualizador de imagens padrão do Windows 7 não o suporta. Lembrei-me de que o visualizador de imagens do Windows XP era capaz de reproduzir corretamente as animações GIF. Por isso, passei algum tempo superando alguns obstáculos e executando o antigo visualizador de imagens no Windows moderno, um pequeno iniciador foi criado para esse fim. Agora eu posso assistir essas imagens antigas na interface autêntica do visualizador de imagens antigas do Windows XP.


Download: shimgvw_xp32.7z (inclui um código binário e de origem do iniciador e o shimgvw.dll do inglês Windows XP SP3).

Como isso foi feito?


O visualizador de imagens padrão do Windows XP não é apenas um aplicativo. É executado pelo Windows Explorer da biblioteca dinâmica shlimgvw.dll. Não é possível executá-lo diretamente, você precisa de um mediador como rundll32 para esse fim (é necessário o caminho para um arquivo de imagem existente):

rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif 

Mas esse truque não funciona quando você tenta executar o shimgvw.dll no Windows XP no Windows 7, o shimgvw.dll requer o modo de compatibilidade do Windows XP ativado. É possível fazer isso definindo este modo de compatibilidade para uma cópia do rundll32, mas é um hack feio e causa a exibição da caixa de diálogo do UAC em todas as execuções do visualizador, portanto, não é apropriado.

Após uma breve sessão de depuração, encontrei o culpado. O shimgvw.dll importa implicitamente algumas funções de shell obsoletas do shunimpl.dll, e a última biblioteca se recusa a carregar se não houver ATOM "FailObsoleteShellAPIs" do ATOM (caso contrário, ele carrega corretamente, mas as funções obsoletas retornam códigos de erro). O modo de compatibilidade do Windows XP adiciona esse ATOM (além de muitas outras coisas), é por isso que o visualizador de imagens é capaz de executar nesse modo.

Um carregador leve para o shimgvw.dll foi implementado. Ele adiciona ATOM “FailObsoleteShellAPIs”, pergunta qual imagem deve ser aberta (se não foi passada como argumento) e depois passa a execução para o shimgvw.dll. O visualizador funciona corretamente, portanto, não investiguei para que servem essas funções obsoletas do shell. Pelo menos, não é algo crucial.

Source: https://habr.com/ru/post/pt437436/


All Articles