123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697 |
- #ifndef __ATLTRANSACTIONMANAGER_H__
- #define __ATLTRANSACTIONMANAGER_H__
- #pragma once
- #include <atldef.h>
- #if !defined(_ATL_USE_WINAPI_FAMILY_DESKTOP_APP)
- #error This file is not compatible with the current WINAPI_FAMILY
- #endif
- #include <ktmw32.h>
- #include <tchar.h>
- extern "C" _VCRTIMP bool __cdecl __uncaught_exception();
- #pragma pack(push,_ATL_PACKING)
- namespace ATL
- {
- class CAtlTransactionManager
- {
- public:
-
-
-
-
- explicit CAtlTransactionManager(_In_ BOOL bFallback = TRUE, _In_ BOOL bAutoCreateTransaction = TRUE) :
- m_hTransaction(NULL), m_bFallback(bFallback)
- {
- if (bAutoCreateTransaction)
- {
- Create();
- }
- }
-
-
- ~CAtlTransactionManager()
- {
- if (m_hTransaction != NULL)
- {
- if (__uncaught_exception())
- {
- Rollback();
- }
- else
- {
- Commit();
- }
- Close();
- }
- }
- private:
-
-
- CAtlTransactionManager(_In_ const CAtlTransactionManager &atm);
- CAtlTransactionManager &operator=(_In_ const CAtlTransactionManager &atm);
- public:
-
-
-
-
- HANDLE GetHandle() const
- {
- return m_hTransaction;
- }
-
-
-
-
- BOOL IsFallback() const
- {
- return m_bFallback;
- }
- public:
-
-
-
-
- BOOL Create();
-
-
-
-
- BOOL Close();
-
-
-
-
- BOOL Commit();
-
-
-
-
- BOOL Rollback();
-
-
-
-
-
-
-
-
-
-
-
- HANDLE CreateFile(
- _In_z_ LPCTSTR lpFileName,
- _In_ DWORD dwDesiredAccess,
- _In_ DWORD dwShareMode,
- _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _In_ DWORD dwCreationDisposition,
- _In_ DWORD dwFlagsAndAttributes,
- _In_opt_ HANDLE hTemplateFile);
-
-
-
-
-
- BOOL DeleteFile(_In_z_ LPCTSTR lpFileName);
-
-
-
-
-
-
- BOOL MoveFile(
- _In_z_ LPCTSTR lpOldFileName,
- _In_z_ LPCTSTR lpNewFileName);
-
-
-
-
-
- DWORD GetFileAttributes(_In_z_ LPCTSTR lpFileName);
-
-
-
-
-
-
-
- _Success_(return != FALSE) BOOL GetFileAttributesEx(
- _In_z_ LPCTSTR lpFileName,
- _In_ GET_FILEEX_INFO_LEVELS fInfoLevelId,
- _Out_opt_ LPVOID lpFileInformation);
-
-
-
-
-
-
- BOOL SetFileAttributes(
- _In_z_ LPCTSTR lpFileName,
- _In_ DWORD dwAttributes);
-
-
-
-
-
-
- _Success_(return != INVALID_HANDLE_VALUE) HANDLE FindFirstFile(
- _In_z_ LPCTSTR lpFileName,
- _Out_opt_ WIN32_FIND_DATA* pNextInfo);
-
-
-
-
-
-
-
-
-
-
-
-
- LSTATUS RegCreateKeyEx(
- _In_ HKEY hKey,
- _In_z_ LPCTSTR lpSubKey,
- _Reserved_ DWORD dwReserved,
- _In_opt_z_ LPTSTR lpClass,
- _In_ DWORD dwOptions,
- _In_ REGSAM samDesired,
- _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _Out_ PHKEY phkResult,
- _Out_opt_ LPDWORD lpdwDisposition);
-
-
-
-
-
-
-
-
-
- LSTATUS RegOpenKeyEx(
- _In_ HKEY hKey,
- _In_opt_z_ LPCTSTR lpSubKey,
- _In_ DWORD ulOptions,
- _In_ REGSAM samDesired,
- _Out_ PHKEY phkResult);
-
-
-
-
-
-
- LSTATUS RegDeleteKey(
- _In_ HKEY hKey,
- _In_z_ LPCTSTR lpSubKey);
- protected:
-
-
- HANDLE m_hTransaction;
-
-
- BOOL m_bFallback;
- };
- inline BOOL CAtlTransactionManager::Create()
- {
- if (m_hTransaction != NULL)
- {
-
- ATLASSERT(FALSE);
- return FALSE;
- }
- typedef HANDLE (WINAPI* PFNCREATETRANSACTION)(LPSECURITY_ATTRIBUTES, LPGUID, DWORD, DWORD, DWORD, DWORD, LPWSTR);
- static bool bInitialized = false;
- static PFNCREATETRANSACTION pfCreateTransaction = NULL;
- if (!bInitialized)
- {
- HMODULE hKTM32 = AtlLoadSystemLibraryUsingFullPath(L"ktmw32.dll");
- if (hKTM32 != NULL)
- {
- pfCreateTransaction = (PFNCREATETRANSACTION)GetProcAddress(hKTM32, "CreateTransaction");
- }
- bInitialized = true;
- }
- if (pfCreateTransaction == NULL)
- {
- return FALSE;
- }
- SECURITY_ATTRIBUTES sa;
- ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
- m_hTransaction = (*pfCreateTransaction)(&sa, 0, 0, 0, 0, 0, NULL);
- return m_hTransaction != NULL;
- }
- inline BOOL CAtlTransactionManager::Close()
- {
- if (m_hTransaction == NULL)
- {
- return FALSE;
- }
- if (!::CloseHandle(m_hTransaction))
- {
- return FALSE;
- }
- m_hTransaction = NULL;
- return TRUE;
- }
- inline BOOL CAtlTransactionManager::Commit()
- {
- if (m_hTransaction == NULL)
- {
- ATLASSERT(FALSE);
- return FALSE;
- }
- typedef BOOL (WINAPI* PFNCOMMITTRANSACTION)(HANDLE);
- static bool bInitialized = false;
- static PFNCOMMITTRANSACTION pfCommitTransaction = NULL;
- if (!bInitialized)
- {
- HMODULE hKTM32 = AtlLoadSystemLibraryUsingFullPath(L"ktmw32.dll");
- if (hKTM32 != NULL)
- {
- pfCommitTransaction = (PFNCOMMITTRANSACTION)GetProcAddress(hKTM32, "CommitTransaction");
- }
- bInitialized = true;
- }
- if (pfCommitTransaction != NULL)
- {
- return (*pfCommitTransaction)(m_hTransaction);
- }
- return FALSE;
- }
- inline BOOL CAtlTransactionManager::Rollback()
- {
- if (m_hTransaction == NULL)
- {
- ATLASSERT(FALSE);
- return FALSE;
- }
- typedef BOOL (WINAPI* PFNROLLBACKTRANSACTION)(HANDLE);
- static bool bInitialized = false;
- static PFNROLLBACKTRANSACTION pfRollbackTransaction = NULL;
- if (!bInitialized)
- {
- HMODULE hKTM32 = AtlLoadSystemLibraryUsingFullPath(L"ktmw32.dll");
- if (hKTM32 != NULL)
- {
- pfRollbackTransaction = (PFNROLLBACKTRANSACTION)GetProcAddress(hKTM32, "RollbackTransaction");
- }
- bInitialized = true;
- }
- if (pfRollbackTransaction != NULL)
- {
- return (*pfRollbackTransaction)(m_hTransaction);
- }
- return FALSE;
- }
- inline HANDLE CAtlTransactionManager::CreateFile(
- _In_z_ LPCTSTR lpFileName,
- _In_ DWORD dwDesiredAccess,
- _In_ DWORD dwShareMode,
- _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _In_ DWORD dwCreationDisposition,
- _In_ DWORD dwFlagsAndAttributes,
- _In_opt_ HANDLE hTemplateFile)
- {
- if (m_hTransaction != NULL)
- {
- HMODULE hKernel32 = ::GetModuleHandle(_T("kernel32.dll"));
- ATLASSERT(hKernel32 != NULL);
- if (hKernel32 == NULL)
- {
- return INVALID_HANDLE_VALUE;
- }
- #ifdef _UNICODE
- typedef HANDLE (WINAPI* PFNCREATEFILETRANSACTED)(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE, HANDLE, PUSHORT, PVOID);
- PFNCREATEFILETRANSACTED pfCreateTransacted = (PFNCREATEFILETRANSACTED)GetProcAddress(hKernel32, "CreateFileTransactedW");
- #else
- typedef HANDLE (WINAPI* PFNCREATEFILETRANSACTED)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE, HANDLE, PUSHORT, PVOID);
- PFNCREATEFILETRANSACTED pfCreateTransacted = (PFNCREATEFILETRANSACTED)GetProcAddress(hKernel32, "CreateFileTransactedA");
- #endif
- if (pfCreateTransacted != NULL)
- {
- return (*pfCreateTransacted)(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, m_hTransaction, NULL, NULL);
- }
- }
- else if (m_bFallback)
- {
- return ::CreateFile((LPCTSTR)lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, NULL);
- }
- return INVALID_HANDLE_VALUE;
- }
- inline BOOL CAtlTransactionManager::DeleteFile(_In_z_ LPCTSTR lpFileName)
- {
- if (m_hTransaction != NULL)
- {
- HMODULE hKernel32 = ::GetModuleHandle(_T("kernel32.dll"));
- ATLASSERT(hKernel32 != NULL);
- if (hKernel32 == NULL)
- {
- return FALSE;
- }
- #ifdef _UNICODE
- typedef BOOL (WINAPI* PFNDELETEFILETRANSACTED)(LPCWSTR, HANDLE);
- PFNDELETEFILETRANSACTED pfDeleteTransacted = (PFNDELETEFILETRANSACTED)GetProcAddress(hKernel32, "DeleteFileTransactedW");
- #else
- typedef BOOL (WINAPI* PFNDELETEFILETRANSACTED)(LPCSTR, HANDLE);
- PFNDELETEFILETRANSACTED pfDeleteTransacted = (PFNDELETEFILETRANSACTED)GetProcAddress(hKernel32, "DeleteFileTransactedA");
- #endif
- if (pfDeleteTransacted != NULL)
- {
- return (*pfDeleteTransacted)(lpFileName, m_hTransaction);
- }
- }
- else if (m_bFallback)
- {
- return DeleteFile((LPTSTR)lpFileName);
- }
- return FALSE;
- }
- inline BOOL CAtlTransactionManager::MoveFile(
- _In_z_ LPCTSTR lpOldFileName,
- _In_z_ LPCTSTR lpNewFileName)
- {
- if (m_hTransaction != NULL)
- {
- HMODULE hKernel32 = ::GetModuleHandle(_T("kernel32.dll"));
- ATLASSERT(hKernel32 != NULL);
- if (hKernel32 == NULL)
- {
- return FALSE;
- }
- #ifdef _UNICODE
- typedef BOOL (WINAPI* PFNMOVEFILETRANSACTED)(LPCWSTR, LPCWSTR, LPPROGRESS_ROUTINE, LPVOID, DWORD, HANDLE);
- PFNMOVEFILETRANSACTED pfMoveFileTransacted = (PFNMOVEFILETRANSACTED)GetProcAddress(hKernel32, "MoveFileTransactedW");
- #else
- typedef BOOL (WINAPI* PFNMOVEFILETRANSACTED)(LPCSTR, LPCSTR, LPPROGRESS_ROUTINE, LPVOID, DWORD, HANDLE);
- PFNMOVEFILETRANSACTED pfMoveFileTransacted = (PFNMOVEFILETRANSACTED)GetProcAddress(hKernel32, "MoveFileTransactedA");
- #endif
- if (pfMoveFileTransacted != NULL)
- {
- return (*pfMoveFileTransacted)(lpOldFileName, lpNewFileName, NULL, NULL, MOVEFILE_COPY_ALLOWED, m_hTransaction);
- }
- }
- else if (m_bFallback)
- {
- return ::MoveFile(lpOldFileName, lpNewFileName);
- }
- return FALSE;
- }
- inline _Success_(return != FALSE) BOOL CAtlTransactionManager::GetFileAttributesEx(
- _In_z_ LPCTSTR lpFileName,
- _In_ GET_FILEEX_INFO_LEVELS fInfoLevelId,
- _Out_opt_ LPVOID lpFileInformation)
- {
- if (lpFileInformation == NULL)
- {
- return FALSE;
- }
- if (m_hTransaction != NULL)
- {
- HMODULE hKernel32 = ::GetModuleHandle(_T("kernel32.dll"));
- ATLASSERT(hKernel32 != NULL);
- if (hKernel32 == NULL)
- {
- return FALSE;
- }
- #ifdef _UNICODE
- typedef BOOL (WINAPI* PFNGETFILEATTRIBUTESTRANSACTED)(LPCWSTR, GET_FILEEX_INFO_LEVELS, LPVOID, HANDLE);
- PFNGETFILEATTRIBUTESTRANSACTED pfGetFileAttributesTransacted = (PFNGETFILEATTRIBUTESTRANSACTED)GetProcAddress(hKernel32, "GetFileAttributesTransactedW");
- #else
- typedef BOOL (WINAPI* PFNGETFILEATTRIBUTESTRANSACTED)(LPCSTR, GET_FILEEX_INFO_LEVELS, LPVOID, HANDLE);
- PFNGETFILEATTRIBUTESTRANSACTED pfGetFileAttributesTransacted = (PFNGETFILEATTRIBUTESTRANSACTED)GetProcAddress(hKernel32, "GetFileAttributesTransactedA");
- #endif
- if (pfGetFileAttributesTransacted != NULL)
- {
- return (*pfGetFileAttributesTransacted)(lpFileName, fInfoLevelId, lpFileInformation, m_hTransaction);
- }
- }
- else if (m_bFallback)
- {
- return ::GetFileAttributesEx((LPCTSTR)lpFileName, fInfoLevelId, lpFileInformation);
- }
- return FALSE;
- }
- inline DWORD CAtlTransactionManager::GetFileAttributes(_In_z_ LPCTSTR lpFileName)
- {
- WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
- if (GetFileAttributesEx(lpFileName, GetFileExInfoStandard, &fileAttributeData))
- {
- return fileAttributeData.dwFileAttributes;
- }
- return 0;
- }
- inline BOOL CAtlTransactionManager::SetFileAttributes(
- _In_z_ LPCTSTR lpFileName,
- _In_ DWORD dwAttributes)
- {
- if (m_hTransaction != NULL)
- {
- HMODULE hKernel32 = ::GetModuleHandle(_T("kernel32.dll"));
- ATLASSERT(hKernel32 != NULL);
- if (hKernel32 == NULL)
- {
- return FALSE;
- }
- #ifdef _UNICODE
- typedef BOOL (WINAPI* PFNSETFILEATTRIBUTESTRANSACTED)(LPCWSTR, DWORD, HANDLE);
- PFNSETFILEATTRIBUTESTRANSACTED pfSetFileAttributesTransacted = (PFNSETFILEATTRIBUTESTRANSACTED)GetProcAddress(hKernel32, "SetFileAttributesTransactedW");
- #else
- typedef BOOL (WINAPI* PFNSETFILEATTRIBUTESTRANSACTED)(LPCSTR, DWORD, HANDLE);
- PFNSETFILEATTRIBUTESTRANSACTED pfSetFileAttributesTransacted = (PFNSETFILEATTRIBUTESTRANSACTED)GetProcAddress(hKernel32, "SetFileAttributesTransactedA");
- #endif
- if (pfSetFileAttributesTransacted != NULL)
- {
- return (*pfSetFileAttributesTransacted)(lpFileName, dwAttributes, m_hTransaction);
- }
- }
- else if (m_bFallback)
- {
- return ::SetFileAttributes((LPCTSTR)lpFileName, dwAttributes);
- }
- return FALSE;
- }
- inline _Success_(return != INVALID_HANDLE_VALUE) HANDLE CAtlTransactionManager::FindFirstFile(
- _In_z_ LPCTSTR lpFileName,
- _Out_opt_ WIN32_FIND_DATA* pNextInfo)
- {
- if (pNextInfo == NULL)
- {
- return INVALID_HANDLE_VALUE;
- }
- if (m_hTransaction != NULL)
- {
- HMODULE hKernel32 = ::GetModuleHandle(_T("kernel32.dll"));
- ATLASSERT(hKernel32 != NULL);
- if (hKernel32 == NULL)
- {
- return INVALID_HANDLE_VALUE;
- }
- #ifdef _UNICODE
- typedef HANDLE (WINAPI* PFNFINDFIRSTFILETRANSACTED)(LPCWSTR, FINDEX_INFO_LEVELS, LPVOID, FINDEX_SEARCH_OPS, LPVOID, DWORD, HANDLE);
- PFNFINDFIRSTFILETRANSACTED pfFindFirstFileTransacted = (PFNFINDFIRSTFILETRANSACTED)GetProcAddress(hKernel32, "FindFirstFileTransactedW");
- #else
- typedef HANDLE (WINAPI* PFNFINDFIRSTFILETRANSACTED)(LPCSTR, FINDEX_INFO_LEVELS, LPVOID, FINDEX_SEARCH_OPS, LPVOID, DWORD, HANDLE);
- PFNFINDFIRSTFILETRANSACTED pfFindFirstFileTransacted = (PFNFINDFIRSTFILETRANSACTED)GetProcAddress(hKernel32, "FindFirstFileTransactedA");
- #endif
- if (pfFindFirstFileTransacted != NULL)
- {
- return (*pfFindFirstFileTransacted)(lpFileName, FindExInfoStandard, pNextInfo, FindExSearchNameMatch, NULL, 0, m_hTransaction);
- }
- }
- else if (m_bFallback)
- {
- return ::FindFirstFile(lpFileName, pNextInfo);
- }
- return INVALID_HANDLE_VALUE;
- }
- inline LSTATUS CAtlTransactionManager::RegOpenKeyEx(
- _In_ HKEY hKey,
- _In_opt_z_ LPCTSTR lpSubKey,
- _In_ DWORD ulOptions,
- _In_ REGSAM samDesired,
- _Out_ PHKEY phkResult)
- {
- if (m_hTransaction != NULL)
- {
- HMODULE hAdvAPI32 = ::GetModuleHandle(_T("Advapi32.dll"));
- ATLASSERT(hAdvAPI32 != NULL);
- if (hAdvAPI32 == NULL)
- {
- return ERROR_INVALID_FUNCTION;
- }
- #ifdef _UNICODE
- typedef LSTATUS (WINAPI* PFNREGOPENKEYTRANSACTED)(HKEY, LPCWSTR, DWORD, REGSAM, PHKEY, HANDLE, PVOID);
- PFNREGOPENKEYTRANSACTED pfRegOpenKeyTransacted = (PFNREGOPENKEYTRANSACTED)GetProcAddress(hAdvAPI32, "RegOpenKeyTransactedW");
- #else
- typedef LSTATUS (WINAPI* PFNREGOPENKEYTRANSACTED)(HKEY, LPCSTR, DWORD, REGSAM, PHKEY, HANDLE, PVOID);
- PFNREGOPENKEYTRANSACTED pfRegOpenKeyTransacted = (PFNREGOPENKEYTRANSACTED)GetProcAddress(hAdvAPI32, "RegOpenKeyTransactedA");
- #endif
- if (pfRegOpenKeyTransacted != NULL)
- {
- return (*pfRegOpenKeyTransacted)(hKey, lpSubKey, ulOptions, samDesired, phkResult, m_hTransaction, NULL);
- }
- }
- else if (m_bFallback)
- {
- return ::RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, phkResult);
- }
- return ERROR_INVALID_FUNCTION;
- }
- inline LSTATUS CAtlTransactionManager::RegCreateKeyEx(
- _In_ HKEY hKey,
- _In_z_ LPCTSTR lpSubKey,
- _Reserved_ DWORD dwReserved,
- _In_opt_z_ LPTSTR lpClass,
- _In_ DWORD dwOptions,
- _In_ REGSAM samDesired,
- _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _Out_ PHKEY phkResult,
- _Out_opt_ LPDWORD lpdwDisposition)
- {
- if (m_hTransaction != NULL)
- {
- HMODULE hAdvAPI32 = ::GetModuleHandle(_T("Advapi32.dll"));
- ATLASSERT(hAdvAPI32 != NULL);
- if (hAdvAPI32 == NULL)
- {
- return ERROR_INVALID_FUNCTION;
- }
- #ifdef _UNICODE
- typedef LSTATUS (WINAPI* PFNREGCREATEKEYTRANSACTED)(HKEY, LPCWSTR, DWORD, LPWSTR, DWORD, REGSAM, CONST LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD, HANDLE, PVOID);
- PFNREGCREATEKEYTRANSACTED pfRegCreateKeyTransacted = (PFNREGCREATEKEYTRANSACTED)GetProcAddress(hAdvAPI32, "RegCreateKeyTransactedW");
- #else
- typedef LSTATUS (WINAPI* PFNREGCREATEKEYTRANSACTED)(HKEY, LPCSTR, DWORD, LPSTR, DWORD, REGSAM, CONST LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD, HANDLE, PVOID);
- PFNREGCREATEKEYTRANSACTED pfRegCreateKeyTransacted = (PFNREGCREATEKEYTRANSACTED)GetProcAddress(hAdvAPI32, "RegCreateKeyTransactedA");
- #endif
- if (pfRegCreateKeyTransacted != NULL)
- {
- return (*pfRegCreateKeyTransacted)(hKey, lpSubKey, dwReserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition, m_hTransaction, NULL);
- }
- }
- else if (m_bFallback)
- {
- return ::RegCreateKeyEx(hKey, lpSubKey, dwReserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
- }
- return ERROR_INVALID_FUNCTION;
- }
- inline LSTATUS CAtlTransactionManager::RegDeleteKey(_In_ HKEY hKey, _In_z_ LPCTSTR lpSubKey)
- {
- if (m_hTransaction != NULL)
- {
- HMODULE hAdvAPI32 = ::GetModuleHandle(_T("Advapi32.dll"));
- ATLASSERT(hAdvAPI32 != NULL);
- if (hAdvAPI32 == NULL)
- {
- return ERROR_INVALID_FUNCTION;
- }
- #ifdef _UNICODE
- typedef LSTATUS (WINAPI* PFNREGDELETEKEYTRANSACTED)(HKEY, LPCWSTR, REGSAM, DWORD, HANDLE, PVOID);
- PFNREGDELETEKEYTRANSACTED pfRegDeleteKeyTransacted = (PFNREGDELETEKEYTRANSACTED)GetProcAddress(hAdvAPI32, "RegDeleteKeyTransactedW");
- #else
- typedef LSTATUS (WINAPI* PFNREGDELETEKEYTRANSACTED)(HKEY, LPCSTR, REGSAM, DWORD, HANDLE, PVOID);
- PFNREGDELETEKEYTRANSACTED pfRegDeleteKeyTransacted = (PFNREGDELETEKEYTRANSACTED)GetProcAddress(hAdvAPI32, "RegDeleteKeyTransactedA");
- #endif
- if (pfRegDeleteKeyTransacted != NULL)
- {
- return (*pfRegDeleteKeyTransacted)(hKey, lpSubKey, 0, 0, m_hTransaction, NULL);
- }
- }
- else if (m_bFallback)
- {
- return ::RegDeleteKey(hKey, lpSubKey);
- }
- return ERROR_INVALID_FUNCTION;
- }
- }
- #pragma pack(pop)
- #endif
|