Olá Pessoal! Essa semana eu me deparei com um enorme problema em minha aplicação. Eu precisava que esta iniciasse quando o Windows fosse inicializado. Ao rodar a aplicação no Windows XP tudo rodou perfeitamente, entretanto, ao rodar no Windows Vista e Seven a situação se complicou, pois a aplicação só acessa os registros do Windows se for executada como administrador ou em modo de compatibilidade XP. E como precisamos que a aplicação se inicie automaticamente não podemos ficar contanto com a boa vontade do usuário de ficar configurando o executável. Nem consigo imaginar o número de ligações de suporte. Como ferramentas de trabalho, estaremos utilizando o Delphi XE2 e o Notepad.

Os passos a seguir requerem muita atenção para perfeito funcionamento.

Abra o NotePad (Bloco de Notas) de seu computador e insira os seguintes códigos XML:

Listagem 1: Win7UAC.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="ProjetoTeste.exe" version="3.1.0.0" processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
    </application>
  </compatibility>
</assembly>
Win7UAC.manifest

Figura 1: Win7UAC.manifest

Na 3ª linha substitua o nome do ProjetoTeste.exe pelo SeuProjeto.exe. Clique em Save As (Salvar Como) e atribua o seguinte nome “Win7UAC.manifest”. O arquivo deve ser salvo no mesmo diretório do executável.

Abra novamente o Notepad (bloco de notas) em branco e insira o seguinte código:

Listagem 2: Win7UAC.rc

1 24 "Win7UAC.manifest"
Win7UAC.rc

Figura 2: Win7UAC.rc

Clique em Save As (Salvar Como) e atribua o seguinte nome “Win7UAC.rc”. Salve, também, este arquivo no mesmo diretório do executável.

Agora, vamos adicionar este último arquivo ao nosso projeto. No Menu principal do Delphi vá até Project | Add to Project e selecione o arquivo “Win7UAC.rc”. Na TreeView do Project Manager deverá aparecer o arquivo adicionado conforme figura abaixo:

Win7UAC no Project Manager

Figura 3: Win7UAC no Project Manager

Compile a aplicação. Após o fim da compilação vá até o diretório do executável e verifique se foi criado o arquivo Win7UAC.RES. Esse arquivo deve ser usado como opção de inicialização do sistema e é através dele que serão dados os privilégios de rodar como administrador automaticamente. Quando compilamos uma aplicação, ela automaticamente gera um arquivo SeuProjeto.RES que será usado como Manifest inicial. O que iremos fazer é substituir esse arquivo pelo nosso manifest.

Assim sendo, vá até o Menu Project | Options | Application e onde estiver marcada a opção “Enable RunTime Themes” substitua por “Use Custom Manifest”. Logo abaixo aparecerá uma opção para que você selecione o arquivo manifest que deseja utilizar. Selecione o arquivo “Win7UAC.manifest” criado e execute sua aplicação.

o arquivo Manifest

Figura 4: Customizando o arquivo Manifest

Execute sua aplicação e verá que não será mais exigido o privilégio de administrador para a utilização e manipulação de registros.

Um grande abraço e até o próximo artigo.