sessão 2 – Criar, consultar, alterar e remover chaves do Registry.
Bibliografia de apoio:
Capítulo 3 do Livro Windows System Programming (da Bibliografia) (pags. 86-97)
MSDN:
Registry Functions: https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-functions
32-bit and 64-bit Application Data in the Registry: https://docs.microsoft.com/en-us/windows/win32/sysinfo/32-bit-and-64-bit-application-data-in-the-registry?redirectedfrom=MSDN
Criação de processo e espera até terminar:
TCHAR comando[TAM] = TEXT("notepad-exe ficheiro.txt");
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
if (CreateProcess(NULL, comando, NULL, NULL, 0, 0, NULL, &si, &pi)
{
_tprintf(TEXT("processo com PID: %d foi lançado"), pi.dwProcessId);
WaitForSingleObject(pi.hProcess, INFINITE);
}
O editor do registry: registry editor (regedit)
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE (só admin, todos os programas que são instalados)
Para criar fica assim:
#include <windows.h>
#include <tchar.h>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#define TAM 200
int _tmain(int argc, TCHAR* argv[]) {
HKEY chave; //handle para a chave depois de ser aberta/criada
//caminho e nome da chave é criada SOFTWARE\\SO2\\chaveLab, uso da contrabarra "\\"
TCHAR chave_nome[TAM] = TEXT("SOFTWARE\\SO2\\chaveLab"), par_nome[TAM], par_valor[TAM];
DWORD resultado; //com o que aconteceu com a chave
#ifdef UNICODE
_setmode(_fileno(stdin), _O_WTEXT);
_setmode(_fileno(stdout), _O_WTEXT);
_setmode(_fileno(stderr), _O_WTEXT);
#endif
//para criar ou abrir uma chave do registry
//RegCreateKeyEx retorna um valor se a chave foi criada/aberta com sucesso
if(RegCreateKeyEx(
//HKEY hKey,
HKEY_CURRENT_USER,
//nome da chave
//LPCTSTR lpSubKey,
chave_nome,
//DWORD Reserved,
0,
//LPTSTR lpClass,
NULL,
//DWORD dwOptions, longevidade da chave
REG_OPTION_NON_VOLATILE,
//REGSAM samDesired,
KEY_ALL_ACCESS,
//const LPSECURITY_ATTRIBUTES lpSecurityAttributes, segurança da chave
NULL,
// PHKEY phkResult,
&chave,
//LPDWORD lpdwDisposition
&resultado
) != ERROR_SUCCESS)
{
_tprintf(TEXT("chave não foi criada nem aberta! ERRO!"));
return -1;
}
if(resultado == REG_CREATED_NEW_KEY)
{
_tprintf(TEXT("a chave foi criada: %s"), chave_nome);
}else
{
_tprintf(TEXT("a chave foi criada: %s"), chave_nome);
}
RegCloseKey(chave); //importante: fechar sempre o Handle da chave
return 0;
}

Os atributos de uma chave são: nome, tipo, e valor
#include <windows.h>
#include <tchar.h>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#define TAM 200
int _tmain(int argc, TCHAR* argv[]) {
HKEY chave; //handle para a chave depois de ser aberta/criada
//caminho e nome da chave é criada SOFTWARE\\SO2\\chaveLab, uso da contrabarra "\\"
TCHAR chave_nome[TAM] = TEXT("SOFTWARE\\SO2\\chaveLab");
TCHAR par_nome[TAM] = TEXT("1º atributo");
TCHAR par_valor[TAM] = TEXT("É o novo valor");
DWORD resultado; //com o que aconteceu com a chave
#ifdef UNICODE
_setmode(_fileno(stdin), _O_WTEXT);
_setmode(_fileno(stdout), _O_WTEXT);
_setmode(_fileno(stderr), _O_WTEXT);
#endif
//para criar ou abrir uma chave do registry
//RegCreateKeyEx retorna um valor se a chave foi criada/aberta com sucesso
if(RegCreateKeyEx(
//HKEY hKey,
HKEY_CURRENT_USER,
//nome da chave
//LPCTSTR lpSubKey,
chave_nome,
//DWORD Reserved,
0,
//LPTSTR lpClass,
NULL,
//DWORD dwOptions, longevidade da chave
REG_OPTION_NON_VOLATILE,
//REGSAM samDesired,
KEY_ALL_ACCESS,
//const LPSECURITY_ATTRIBUTES lpSecurityAttributes, segurança da chave
NULL,
// PHKEY phkResult,
&chave,
//LPDWORD lpdwDisposition
&resultado
) != ERROR_SUCCESS)
{
_tprintf(TEXT("chave não foi criada nem aberta! ERRO!"));
return -1;
}
if(resultado == REG_CREATED_NEW_KEY)
{
_tprintf(TEXT("a chave foi criada: %s"), chave_nome);
}else
{
_tprintf(TEXT("a chave foi aberta: %s"), chave_nome);
}
//criar oar nomeatributo = valor (1 por cada chamada da função)
if(RegSetValueEx(
//HKEY hKey,
chave,
//LPCSTR lpValueName,
par_nome,
//DWORD Reserved,
0,
//DWORD dwType, //tipo: string (REG_SZ), inteiro (REG_WORD), bloco de bytes (REG_BINARY)
REG_SZ,
//const BYTE * lpData, //ponteiro para void, dá para tudo como o malloc
(const LPCBYTE /*igual c const BYTE **/) par_valor,
//DWORD cbData
sizeof(TCHAR) * (_tcsclen(par_valor)+1)
//+1 para o /0, para ler o /0
) != ERROR_SUCCESS)
{
_tprintf(TEXT("Atributo %s não foi alterado nem criado ERRO\n"), par_nome);
}
//concatenar qq tipos de dados e guardar numa string
//_strpintf_s (par_valor, TAM, TEXT("%s %d"), par_nome, tamanho);
//consultar valor de um atributo
//strcpy(par_nome, TEXT("2º atributo ")); //-> caso fosse necessário escrever a string em c depois de criada
par_valor[0] = '\0';
DWORD tamanho = sizeof(par_valor);
if(RegQueryValueEx(
// HKEY hKey,
chave,
// LPCTSTR lpValueName,
par_nome,
//LPDWORD lpReserved, //é para consulta fica a NULL
0,
//LPDWORD lpType,
NULL,
//LPBYTE lpData,
(LPCBYTE)par_valor,
//LPDWORD lpcbData
&tamanho
) != ERROR_SUCCESS)
{
_tprintf(TEXT("Atributo %s não foi encotnrado!! ERRO\n"), par_nome);
}else
{
_tprintf(TEXT("Atributo encontrado com o valor: %s e tamanho %d"), par_valor, tamanho);
}
DWORD valor_inteiro = 1022;
valor_inteiro *= 2;
_tcscpy_s(par_nome, TAM, TEXT("atributo inteiro"));
if (RegSetValueEx(
chave,
par_nome,
0,
REG_DWORD,
(LPCBYTE) &valor_inteiro,
sizeof(DWORD)
) != ERROR_SUCCESS)
{
_tprintf(TEXT("Atributo %s não foi encotnrado!! ERRO\n"), par_nome);
}
_tcscpy_s(par_nome, TAM, TEXT("atributo binario"));
if (RegSetValueEx(
chave,
par_nome,
0,
REG_BINARY,
(LPCBYTE) &valor_inteiro,
sizeof(DWORD)
) != ERROR_SUCCESS)
{
_tprintf(TEXT("Atributo %s não foi encotnrado!! ERRO\n"), par_nome);
}
RegCloseKey(chave); //importante: fechar sempre o Handle da chave
return 0;
}

0 thoughts on “sessão 2 – Criar, consultar, alterar e remover chaves do Registry.”