Segredos do WindowsÀ espera do RunOnce

Raymond Chen

IMAGINE UMA instalação que precisa reiniciar o sistema no meio do processo. Por exemplo, o programa pode solicitar a atualização de uma DLL do sistema em uso no momento. Você teria de disparar uma reinicialização interveniente para instalar o novo arquivo DLL e, depois da atualização da DLL, poderia usá-la no próximo estágio da instalação.

A chave do RunOnce foi desenvolvida para esse tipo de cenário — para ser usada por programas de instalação com o objetivo de concluir as instalações após uma reinicialização interveniente. (Isso remonta à época em que confiávamos que não haveria erro nos programas.)

O Windows® Explorer aguarda a conclusão do programa RunOnce antes de criar a área de trabalho e a barra de tarefas. Isso ocorre porque o RunOnce foi projetado para operar com programas de instalação. Como o programa RunOnce pode alterar os dados de configuração do sistema, não é conveniente que o sistema seja utilizado durante sua reconfiguração.

Por exemplo, se o programa RunOnce estiver redefinindo a base e vinculando os arquivos que acabou de instalar, e alguns desses arquivos fizerem parte de uma extensão do shell. Sem dúvida, não será conveniente que o usuário tente executar o programa ou ativar a extensão enquanto seu executável ainda estiver no processo de atualização.

Outra armadilha do princípio "para programas de instalação" é que a chave do RunOnce será processada somente se o usuário com privilégios de administrador tiver feito logon. Portanto, os usuários que não são administradores não poderão concluir a instalação. Além disso, se a chave do RunOnce for executada por não-administradores, o programa deixará de ser "de execução única" (run once), o que poderá criar um verdadeiro dilema. Como você diria, "OK, executei uma vez, não o executo novamente"? Para alterar esse estado global do sistema, você precisaria de privilégios administrativos. E, obviamente, o usuário não administrativo não possui privilégios administrativos! O programa deixaria de ser "run once" e passaria a ser "de execução consecutiva até o administrador fazer logon."

  (Clique na imagem para aumentar a exibição)

O RunOnce, desenvolvido para finalizar a instalação do programa, é visível na própria instalação do Windows. Quando você tenta fazer a instalação de um service pack ou a atualização para uma versão mais recente do Windows, o assistente de instalação verifica a chave do RunOnce. Se não estiver vazia, você receberá uma mensagem de erro que diz: "Hey, you still have some unfinished program installation in progress. Please finish that before you try to upgrade the operating system". Isso é oportuno, pois não faz sentido alterar o sistema operacional bem no meio da instalação de um programa.

Todo o design do RunOnce revela seu passado. O programa foi concebido no Windows 95, um sistema operacional que não fazia distinção entre administradores e não-adminstradores. Como no Windows 95, basicamente todo o mundo era administrador, um programa de instalação que utilizasse o RunOnce poderia contar que as ações do RunOnce seriam executadas na próxima reinicialização.

Em versões mais recentes do sistema operacional Windows — especialmente o Windows Vista™ — é possível que ninguém com privilégios de administrador faça logon durante meses. Como resultado, um programa que precisa do RunOnce para ser executado pode ter de esperar um período longo, muito longo.

Eu mesmo já vi um RunOnce perpétuo, que se readicionava à chave do RunOnce sempre que era executado. Isso vai claramente contra o intuito da chave do RunOnce, pois ela deixa de ser parte da instalação e passa a fazer parte da operação normal do programa. Além do mais, esse comportamento faz com que a instalação do Windows sempre reporte que há uma instalação em andamento.

Desse modo, o usuário nunca conseguia atualizar o sistema operacional porque esse programinha irritante não parava de dizer: "I just need to do a few more little things and I'll really be done." The program will not finish installing today, "but surely tomorrow". É o mesmo que esperar Godot, mas sem crises existenciais.

Raymond Chen, The Old New Thing, trata da história do Windows e da programação Win32. Atualmente, ele está trabalhando em um livro, que por coincidência também se chama The Old New Thing (Addison-Wesley, 2007).

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..