logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

C++ com sanidade: usando ATL em aplicações, parte 2

A ATL - como eu já disse antes - cobre diversas áreas da programação Win32, não somente COM. Continuando com a minha série "C++ com sanidade", vou mostrar aqui o acesso ao registro usando ATL. Esse pequeno programa mostra um MessageBox com os HotFixes que estão instalados, lendo essas informações do registro.

#define UNICODE
#define _UNICODE

#include <atlbase.h>
#include <atlstr.h>

int main()
{
   LONG l;

   ATL::CRegKey regKey;
   ATL::CString strKey, strBuffer;
   DWORD dwLen;
   static const wchar_t* wzRegPath = 
         L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix";

   l = regKey.Open(HKEY_LOCAL_MACHINE, wzRegPath, KEY_READ);
   
   if(l != ERROR_SUCCESS)
      return HRESULT_FROM_WIN32(l);


   strBuffer = L"HotFixes instalados:\r\n\r\n";

   for(DWORD dwCurrentKey = 0 ; ; ++dwCurrentKey)

   {
      ATL::CRegKey regSubKey;
      ATL::CString strFixDescription, str;
      
      dwLen = MAX_PATH;
      l = regKey.EnumKey(dwCurrentKey, strKey.GetBuffer(dwLen), &dwLen);

      strKey.ReleaseBuffer();

      if(l != ERROR_SUCCESS)
         break;

      //
      // agora que pegamos o nome da chave, vamos pegar o valor "Fix Description"
      //
      str.Format(L"%s%s", wzRegPath, strKey.GetString());

      l = regSubKey.Open(HKEY_LOCAL_MACHINE, 
                         str,
                         KEY_READ);

      //
      // se o Windows falou que existe, tem que existir. A não ser que o usuário
      // seja muito rápido e consiga apagar a chave no meio da enumeração :-)
      //
      ATLASSERT(l == ERROR_SUCCESS);
      if(l != ERROR_SUCCESS)
         continue;

      //
      // primeiro vamos saber qual o tamanho da string
      //
      dwLen = 0;
      l = regSubKey.QueryStringValue(L"Fix Description", NULL, &dwLen);

      //
      // se não tem "fix description", vamos ignorar
      //
      if(l != ERROR_SUCCESS && l != ERROR_MORE_DATA)
         continue;

      l = regSubKey.QueryStringValue(L"Fix Description", 
                                     strFixDescription.GetBuffer(dwLen), 
                                     &dwLen);
      strFixDescription.ReleaseBuffer();

      if(l != ERROR_SUCCESS)
         continue; // xi... vamos ignorar e passar para o próximo

      strBuffer.AppendFormat(L"%s - "%s"\r\n", 
                             strKey, 
                             strFixDescription.GetString());      
   }

   MessageBox(NULL, strBuffer, L"Windows HotFixes", MB_ICONINFORMATION);
}

Para compilar esse código no Visual C++, use um projeto "Win32 Console Project", e não um "ATL Project". Você pode usar as classes da ATL em qualquer programa, é só adicionar os headers (no caso do ATL::CRegKey, só o atlbase.h é suficiente).

Não se esqueça que minha intenção não é fazer um tutorial sobre as classes da ATL, e sim, mostrar que essas classes existem e dar exemplos práticos de como elas podem facilitar a sua vida, ajudando-o a escrever um código mais claro e menos sujeito à erros. Para mais informações, RTFM


Em 06/04/2005 03:57, por Rodrigo Strauss


  
 
 
Comentários
Murillo | em 22/01/2013 | #
Excelente, foi de grande ajuda.

Obrigado
Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::