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.”