Remember to maintain security and privacy. Do not share sensitive information. Procedimento.com.br may make mistakes. Verify important information. Termo de Responsabilidade

Como Utilizar API de Transações no Ambiente Windows

As APIs de Transações são ferramentas poderosas que permitem que desenvolvedores realizem operações complexas de forma atômica, garantindo que todas as partes de uma operação sejam concluídas com sucesso ou revertidas em caso de falha. No ambiente Windows, a API de Transações é conhecida como Transactional NTFS (TxF) e Transactional Registry (TxR). Essas APIs permitem que operações de sistema de arquivos e de registro sejam realizadas de forma transacional.


Exemplos:


1. Criando uma Transação com Transactional NTFS (TxF)


Para utilizar a API de Transações no NTFS, você pode usar a função CreateTransaction para iniciar uma transação e CommitTransaction para finalizar a transação. Aqui está um exemplo em C++:


#include <Windows.h>
#include <iostream>

int main() {
HANDLE hTransaction = CreateTransaction(NULL, 0, 0, 0, 0, 0, NULL);
if (hTransaction == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to create transaction. Error: " << GetLastError() << std::endl;
return 1;
}

HANDLE hFile = CreateFileTransacted(
L"example.txt",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL,
hTransaction,
NULL,
NULL
);

if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to create file in transaction. Error: " << GetLastError() << std::endl;
RollbackTransaction(hTransaction);
CloseHandle(hTransaction);
return 1;
}

const char* data = "Hello, Transactional NTFS!";
DWORD bytesWritten;
if (!WriteFile(hFile, data, strlen(data), &bytesWritten, NULL)) {
std::cerr << "Failed to write to file. Error: " << GetLastError() << std::endl;
RollbackTransaction(hTransaction);
CloseHandle(hFile);
CloseHandle(hTransaction);
return 1;
}

if (!CommitTransaction(hTransaction)) {
std::cerr << "Failed to commit transaction. Error: " << GetLastError() << std::endl;
RollbackTransaction(hTransaction);
CloseHandle(hFile);
CloseHandle(hTransaction);
return 1;
}

std::cout << "Transaction committed successfully!" << std::endl;

CloseHandle(hFile);
CloseHandle(hTransaction);
return 0;
}

2. Utilizando Transações no Registro com Transactional Registry (TxR)


Para realizar operações transacionais no Registro do Windows, você pode usar funções como RegCreateKeyTransacted e RegSetValueTransacted. Aqui está um exemplo em C++:


#include <Windows.h>
#include <iostream>

int main() {
HANDLE hTransaction = CreateTransaction(NULL, 0, 0, 0, 0, 0, NULL);
if (hTransaction == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to create transaction. Error: " << GetLastError() << std::endl;
return 1;
}

HKEY hKey;
LONG result = RegCreateKeyTransacted(
HKEY_CURRENT_USER,
L"Software\\Example",
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hKey,
NULL,
hTransaction,
NULL
);

if (result != ERROR_SUCCESS) {
std::cerr << "Failed to create registry key. Error: " << result << std::endl;
RollbackTransaction(hTransaction);
CloseHandle(hTransaction);
return 1;
}

const wchar_t* data = L"Transactional Registry Example";
result = RegSetValueEx(
hKey,
L"ExampleValue",
0,
REG_SZ,
(const BYTE*)data,
(DWORD)((wcslen(data) + 1) * sizeof(wchar_t))
);

if (result != ERROR_SUCCESS) {
std::cerr << "Failed to set registry value. Error: " << result << std::endl;
RollbackTransaction(hTransaction);
RegCloseKey(hKey);
CloseHandle(hTransaction);
return 1;
}

if (!CommitTransaction(hTransaction)) {
std::cerr << "Failed to commit transaction. Error: " << GetLastError() << std::endl;
RollbackTransaction(hTransaction);
RegCloseKey(hKey);
CloseHandle(hTransaction);
return 1;
}

std::cout << "Transaction committed successfully!" << std::endl;

RegCloseKey(hKey);
CloseHandle(hTransaction);
return 0;
}

To share Download PDF