⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page00transaction.cpp

📁 This ZIP archive includes the sources (and executable) for the FileTest utility, written by Ladisla
💻 CPP
字号:
/*****************************************************************************/
/* Page00Transaction.cpp                  Copyright (c) Ladislav Zezula 2006 */
/*---------------------------------------------------------------------------*/
/* Description:                                                              */
/*---------------------------------------------------------------------------*/
/*   Date    Ver   Who  Comment                                              */
/* --------  ----  ---  -------                                              */
/* 02.05.06  1.00  Lad  The first version of Page00Transaction.cpp           */
/*****************************************************************************/

#include "FileTest.h"
#include "resource.h"

static void UpdateDialog(HWND hDlg, int nError)
{
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    UINT nIDFormat = IDS_TRANSACTION_NONE;
    BOOL bEnable;

    if(pfnCreateTransaction != NULL)
    {
        // CreateTransaction is allowed when no transaction is created
        bEnable = (BOOL)(IsHandleInvalid(pData->hTransaction));
        EnableDlgItems(hDlg, bEnable, IDC_CREATE_TRANSACTION, IDC_CREATE_TRANSACTION_HINT, 0);

        // CommitTransaction and RollbackTransaction are allowed when a transaction is assigned
        bEnable = (BOOL)(IsHandleValid(pData->hTransaction));
        EnableDlgItems(hDlg, bEnable, IDC_COMMIT_TRANSACTION, IDC_COMMIT_TRANSACTION_HINT,
                                      IDC_ROLLBACK_TRANSACTION, IDC_ROLLBACK_TRANSACTION_HINT,
                                      0);

        // Show the current transaction
        if(IsHandleValid(pData->hTransaction) && pData->bTransactionActive)
            nIDFormat = IDS_TRANSACTION_ACTIVE;
        else
            nIDFormat = IDS_TRANSACTION_INACTIVE;
        
        // Show the last error
        SetLastErrorText(hDlg, IDC_LAST_ERROR, nError);

        // Show the transaction handle
        if(IsHandleInvalid(pData->hTransaction))
            SetDlgItemText(hDlg, IDC_FILE_HANDLE, _T("INVALID_HANDLE_VALUE"));
        else
            Hex2DlgTextPtr(hDlg, IDC_FILE_HANDLE, (DWORD_PTR)pData->hTransaction);

        // Closing transaction is allowed when a transaction is created
        bEnable = (BOOL)(IsHandleValid(pData->hTransaction));
        EnableDlgItems(hDlg, bEnable, IDC_CLOSE_TRANSACTION, IDC_CLOSE_TRANSACTION_HINT, 0);
    }
}

//-----------------------------------------------------------------------------
// Message handlers

static int OnInitDialog(HWND hDlg, LPARAM lParam)
{
    PROPSHEETPAGE * pPage = (PROPSHEETPAGE *)lParam;
    TPropSheetData * pData = (TPropSheetData *)pPage->lParam;

    // Load the transaction APIs, as they are only supported in Vista and later
    SetWindowLongPtr(hDlg, DWLP_USER, (LONG)pPage->lParam);
    pData->hTransaction = INVALID_HANDLE_VALUE;

    // If the transactions are not suported, show only the "not supported" static text
    if(pfnCreateTransaction == NULL)
    {
        ShowDlgItems(hDlg, SW_HIDE, IDC_CREATE_TRANSACTION, IDC_CREATE_TRANSACTION_HINT,
                                    IDC_COMMIT_TRANSACTION, IDC_COMMIT_TRANSACTION_HINT,
                                    IDC_ROLLBACK_TRANSACTION, IDC_ROLLBACK_TRANSACTION_HINT,
                                    0);
        ShowDlgItems(hDlg, SW_SHOW, IDC_NOT_SUPPORTED, 0);
    }

    // Enable buttons if transactions are supported
    UpdateDialog(hDlg, ERROR_SUCCESS);
    return TRUE;
}

static int OnCreateTransaction(HWND hDlg)
{
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    int nError = ERROR_SUCCESS;

    // Create new transaction
    if(nError == ERROR_SUCCESS && pfnCreateTransaction != NULL)
    {
        pData->hTransaction = pfnCreateTransaction(NULL,
                                                   NULL,
                                                   0,
                                                   0,
                                                   0,
                                                   NULL,
                                                   _T("Transaction for FileTest"));
        if(IsHandleValid(pData->hTransaction))
            pData->bTransactionActive = TRUE;
        else
            nError = GetLastError();
    }

    UpdateDialog(hDlg, nError);
    return TRUE;
}

static int OnCommitTransaction(HWND hDlg)
{
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    int nError = ERROR_SUCCESS;

    // Commit the transaction
    if(IsHandleValid(pData->hTransaction))
    {
        if(!pfnCommitTransaction(pData->hTransaction))
            nError = GetLastError();

        pData->bTransactionActive = FALSE;
        pData->bUseTransaction = FALSE;
        UpdateDialog(hDlg, nError);
    }
    return TRUE;
}

static int OnRollbackTransaction(HWND hDlg)
{
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    int nError = ERROR_SUCCESS;

    // Rollback the transaction
    if(IsHandleValid(pData->hTransaction))
    {
        if(!pfnRollbackTransaction(pData->hTransaction))
            nError = GetLastError();

        pData->bTransactionActive = FALSE;
        pData->bUseTransaction = FALSE;
        UpdateDialog(hDlg, nError);
    }
    return TRUE;
}

static int OnCloseTransaction(HWND hDlg)
{
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    int nError = ERROR_SUCCESS;

    // Assign the transaction to the current thread
    if(IsHandleValid(pData->hTransaction))
        CloseHandle(pData->hTransaction);

    // Clear information about transaction
    pData->hTransaction = INVALID_HANDLE_VALUE;

    UpdateDialog(hDlg, nError);
    return TRUE;
}

static int OnDestroy(HWND /* hDlg */)
{
    return FALSE;
}

//-----------------------------------------------------------------------------
// Dialog procedure

static int OnCommand(HWND hDlg, UINT nNotify, UINT nIDCtrl)
{
    if(nNotify == BN_CLICKED)
    {
        switch(nIDCtrl)
        {
            case IDC_CREATE_TRANSACTION:
                OnCreateTransaction(hDlg);
                return TRUE;

            case IDC_COMMIT_TRANSACTION:
                OnCommitTransaction(hDlg);
                return TRUE;

            case IDC_ROLLBACK_TRANSACTION:
                OnRollbackTransaction(hDlg);
                return TRUE;

            case IDC_CLOSE_TRANSACTION:
                OnCloseTransaction(hDlg);
                return TRUE;
        }
    }

    return FALSE;
}

INT_PTR CALLBACK PageProc00(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
            return OnInitDialog(hDlg, lParam);

        case WM_COMMAND:
            return OnCommand(hDlg, HIWORD(wParam), LOWORD(wParam));

        case WM_DESTROY:
            return OnDestroy(hDlg);
    }
    return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -