logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog


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
rebarba rebarba
  ::::