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





Excelente, foi de grande ajuda.
Obrigado