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

📄 regedit.c

📁 wince 用的注册表编辑器源代码。可以看和编辑wince 注册表
💻 C
📖 第 1 页 / 共 2 页
字号:
#define	STRICT
#include	<windows.h>
#include	<windowsx.h>
#include	<string.h>
#include	<tchar.h>
#include	<commctrl.h>
#include	"resource.h"
#include	"import.h"
#include	"convert.h"

HINSTANCE	hInst ;
HWND		hMainWnd = NULL ;
HWND		hCmdBar ;
HWND		hEdtKey ;
HWND		hLbxKey ;
HWND		hLbxVal ;
HWND		hCbxRoot ;
HWND		hBtnLeft ;
HWND		hBtnRight ;
HWND		hBtnEdit ;
HWND		hBtnDelete ;
HWND		hBtnTop ;

DWORD		DllVersion = 0 ;

const	TCHAR	szWinName[] = TEXT("RegEdit") ;
#define		TitleName	szWinName
const	TCHAR	Version[] = TEXT("0.11") ;
const	TCHAR	szNoName[] = TEXT("<No Name>") ;
const	TCHAR	szUnknown[] = TEXT("<Unknown>") ;

static	LPCTSTR	RootStr[] = {
//	TEXT("LocalMachine"), TEXT("CurrentUser"), TEXT("Users"), TEXT("ClassesRoot"),
	TEXT("LMachine"), TEXT("CUser"), TEXT("Users"), TEXT("CRoot"),
} ;
static	HKEY	RootKey[] = {
	HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_USERS, HKEY_CLASSES_ROOT,
} ;
const	DWORD	RootNum = sizeof RootStr / sizeof RootStr[0] ;

HKEY	hKeyRoot = INVALID_HANDLE_VALUE ;
TCHAR	RegSubKey[ 256 ] = TEXT("") ;
TCHAR	ClassName[ 256 ] = TEXT("") ;

TCHAR	KeyName[ MAX_PATH ] = TEXT("") ;
TCHAR	ValueName[ MAX_PATH ] ;
DWORD	ValueType = 0 ;
BYTE	ValueData[ 2048 ] ;
DWORD	ValueSize = 0 ;

TCHAR	Buffer[ 1024 ] ;
TCHAR	MessageBuf[ 256 ] ;

static TBBUTTON tbSTDButton[] = {
	{ 0, 0,            TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},
//	{ 2, IDM_EDIT,     TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},
//	{ 0, 0,            TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},
	{ 5, IDM_NEW_SZ,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},
	{ 7, IDM_NEW_MSZ,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},
	{ 6, IDM_NEW_DW,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},
//	{ 8, IDM_NEW_KEY,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},
//	{ 0, 0,            TBSTATE_ENABLED, TBSTYLE_SEP,    0, 0, 0, -1},
//	{ 3, IDM_DELETE,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},
//	{ 9, IDM_DEL_KEY,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0, -1},
} ;

static	BOOL	init_application( void ) ;
static	BOOL	init_instance( int nCmdShow ) ;
static	void	MainWnd_OnCreate( HWND hWnd, WPARAM wParam, LPARAM lParam ) ;
LRESULT CALLBACK	MainWndFunc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) ;
BOOL CALLBACK	AboutDlgFunc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) ;

BOOL	ListupKeys( LPCTSTR KeyName ) ;
void	GetValueStr( LPTSTR buf, DWORD size ) ;
BOOL	NewValue( DWORD type ) ;
BOOL	EditValue( LPCTSTR name ) ;
BOOL	DeleteValue( LPCTSTR name ) ;
BOOL	NewKey( void ) ;
BOOL	DeleteKey( LPCTSTR keyname ) ;
BOOL CALLBACK	InputBoxDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) ;
BOOL CALLBACK	NewKeyDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) ;
static	BOOL	ExportKey( LPCTSTR keyname ) ;

int WINAPI
#ifdef	_WIN32_WCE
WinMain( HINSTANCE hThisInst, HINSTANCE hPrevInst,
		 LPTSTR lpszArgs, int nWinMode )
#else	/* _WIN32_WCE */
WinMain( HINSTANCE hThisInst, HINSTANCE hPrevInst,
		 LPSTR lpszArgs, int nWinMode )
#endif	/* _WIN32_WCE */
{
	MSG			msg ;
	HACCEL		hAccl ;

	hInst = hThisInst ;

#ifdef	_WIN32_WCE
	InitCommonControls();
#endif	/* _WIN32_WCE */

	init_convert() ;

	/* 僐儅儞僪儔僀儞偵巜掕偝傟偨僼傽僀儖傪僀儞億乕僩偡傞 */
	if ( *lpszArgs ) {
		if ( import_reg( lpszArgs ) ) {
			MessageBox( NULL, TEXT("Done."), szWinName, MB_OK|MB_ICONINFORMATION ) ;
		} else {
			MessageBox( NULL, TEXT("Failed."), szWinName, MB_OK|MB_ICONSTOP ) ;
		}
		goto ExitMain ;
	}

	if ( !init_application() ) {
		goto ExitMain ;
	}

	if ( !init_instance( nWinMode ) ) {
		goto ExitMain ;
	}

#ifdef	_WIN32_WCE
	hAccl = LoadAccelerators( hInst,
							  MAKEINTRESOURCE(IDR_ACCELERATOR1) ) ;
#else	/* _WIN32_WCE */
	hAccl = LoadAccelerators( GetModuleHandle(NULL),
							  MAKEINTRESOURCE(IDR_ACCELERATOR1) ) ;
#endif	/* _WIN32_WCE */

	while ( GetMessage( &msg, NULL, 0, 0 ) ) {
		if ( !TranslateAccelerator( hMainWnd, hAccl, &msg ) ) {
			TranslateMessage( &msg ) ;
		}
		DispatchMessage( &msg ) ;
	}

ExitMain:
	release_convert() ;
	return TRUE ;
}

static	BOOL
init_application( void )
{
	WNDCLASS	wcl ;

	/* 儊僀儞僂傿儞僪僂僋儔僗傪搊榐偡傞 */
	wcl.hInstance = hInst ;
	wcl.lpszClassName = szWinName ;
	wcl.lpfnWndProc = MainWndFunc ;
	wcl.style = CS_HREDRAW|CS_VREDRAW ;
	wcl.hIcon   = NULL ;
	wcl.hCursor = NULL ;
#ifdef	_WIN32_WCE
	wcl.lpszMenuName = 0 ;
#else	/* _WIN32_WCE */
	wcl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1) ;
#endif	/* _WIN32_WCE */
	wcl.cbClsExtra = 0 ;
	wcl.cbWndExtra = 0 ;
	wcl.hbrBackground = GetStockObject( WHITE_BRUSH ) ;
	if ( !RegisterClass( &wcl ) ) {
		return FALSE ;
	}
	return TRUE ;
}

static	BOOL
init_instance( int nCmdShow )
{
	const	DWORD	x0 = 0 ;
	DWORD			y0 = 0, i, x, y, w, h ;

	/* 儊僀儞僂傿儞僪僂傪嶌惉偡傞 */
	hMainWnd = CreateWindowEx( 0, szWinName,
						TitleName,
						WS_VISIBLE,
#ifdef	_WIN32_WCE
						0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
#else	/* _WIN32_WCE */
						0, 0, 480, 240,
#endif	/* _WIN32_WCE */
						NULL,
						NULL,
						hInst,
						NULL ) ;
	if ( !hMainWnd ) {
		return FALSE;
	}

#ifdef	_WIN32_WCE
	/* 僐儅儞僪僶乕傪嶌惉偡傞 */
	hCmdBar = CommandBar_Create( hInst, hMainWnd, 1 ) ;
	/* 儊僯儏乕傪偮偗傞 */
	CommandBar_InsertMenubar( hCmdBar, hInst, IDR_MENU1, 0 ) ;
	/*  */
	CommandBar_AddBitmap( hCmdBar, hInst, IDB_BITMAP1,
						  16, 16, 16 ) ;
	CommandBar_AddButtons( hCmdBar, sizeof(tbSTDButton) / sizeof(TBBUTTON),
						   tbSTDButton ) ;
	/* 廔椆儃僞儞傪偮偗傞 */
	CommandBar_AddAdornments( hCmdBar, CMDBAR_HELP, 0 ) ;
	y0 = CommandBar_Height( hCmdBar ) ;
#endif	/* _WIN32_WCE */

	hCbxRoot = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("COMBOBOX"), TEXT(""),
							CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP|WS_CHILD|WS_VISIBLE,
							2+x0, 2+y0, 64, 80,
							hMainWnd, (HMENU)IDC_CBX_ROOT, hInst, NULL ) ;
	hBtnTop = CreateWindowEx( 0, TEXT("BUTTON"), TEXT("|<"),
							WS_CHILD|WS_VISIBLE,
							3+x0, 27+y0, 24, 20,
							hMainWnd, (HMENU)IDM_TOP, hInst, NULL ) ;
	hBtnLeft = CreateWindowEx( 0, TEXT("BUTTON"), TEXT("<<"),
							WS_CHILD|WS_VISIBLE,
							36+x0, 27+y0, 27, 20,
							hMainWnd, (HMENU)IDM_LEFT, hInst, NULL ) ;
	hBtnRight = CreateWindowEx( 0, TEXT("BUTTON"), TEXT(">>"),
							WS_CHILD|WS_VISIBLE,
							66+x0, 27+y0, 27, 20,
							hMainWnd, (HMENU)IDM_RIGHT, hInst, NULL ) ;
	hBtnEdit = CreateWindowEx( 0, TEXT("BUTTON"), TEXT("Edit"),
							WS_CHILD|WS_VISIBLE,
							156+x0, 27+y0, 33, 20,
							hMainWnd, (HMENU)IDM_EDIT, hInst, NULL ) ;
	hBtnDelete = CreateWindowEx( 0, TEXT("BUTTON"), TEXT("Del"),
							WS_CHILD|WS_VISIBLE,
							198+x0, 27+y0, 27, 20,
							hMainWnd, (HMENU)IDM_DELETE, hInst, NULL ) ;
	w = GetSystemMetrics( SM_CXSCREEN ) ;
	if ( w < 480 ) {
		x = 68 + x0 ;
		w -= x + 2 ;
		hEdtKey = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(""),
								WS_CHILD|WS_VISIBLE,
								x, 3+y0, w, 20,
								hMainWnd, (HMENU)IDC_EDT_KEY, hInst, NULL ) ;
		x = 2 + x0 ;
		w = GetSystemMetrics( SM_CXSCREEN ) - 4 ;
		y = 50 + y0 ;
		hLbxKey = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("LISTBOX"), TEXT(""),
								LBS_NOINTEGRALHEIGHT|WS_VSCROLL|WS_TABSTOP|WS_CHILD|WS_VISIBLE|LBS_NOTIFY|LBS_SORT,
								x, y, w, 104,
								hMainWnd, (HMENU)IDC_LBX_KEY, hInst, NULL ) ;
		y += 104 + 2 ;
		h = GetSystemMetrics( SM_CYSCREEN ) - 24 - y ;
		hLbxVal = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("LISTBOX"), TEXT(""),
								LBS_NOINTEGRALHEIGHT|WS_VSCROLL|WS_TABSTOP|WS_CHILD|WS_VISIBLE|LBS_NOTIFY|LBS_SORT,
								x, y, w, h,
								hMainWnd, (HMENU)IDC_LBX_VALUE, hInst, NULL ) ;
	} else {
		x = 68 + x0 ;
		w -= x + 2 ;
		hEdtKey = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(""),
								WS_CHILD|WS_VISIBLE,
								x, 3+y0, w, 20,
								hMainWnd, (HMENU)IDC_EDT_KEY, hInst, NULL ) ;
		x = 2 + x0 ;
		w = (GetSystemMetrics( SM_CXSCREEN ) - 4) / 2 ;
		y = 50 + y0 ;
		h = GetSystemMetrics( SM_CYSCREEN ) - 24 - y - 2 ;
		hLbxKey = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("LISTBOX"), TEXT(""),
								LBS_NOINTEGRALHEIGHT|WS_VSCROLL|WS_TABSTOP|WS_CHILD|WS_VISIBLE|LBS_NOTIFY|LBS_SORT,
								x, y, w, h,
								hMainWnd, (HMENU)IDC_LBX_KEY, hInst, NULL ) ;
		x += w + 2 ;
		hLbxVal = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("LISTBOX"), TEXT(""),
								LBS_NOINTEGRALHEIGHT|WS_VSCROLL|WS_TABSTOP|WS_CHILD|WS_VISIBLE|LBS_NOTIFY|LBS_SORT,
								x, y, w, h,
								hMainWnd, (HMENU)IDC_LBX_VALUE, hInst, NULL ) ;
	}

	for ( i = 0 ; i < RootNum ; i ++ ) {
		SendMessage( hCbxRoot, CB_ADDSTRING, 0, (LPARAM)RootStr[i] ) ;
	}

	/* 儊僀儞僂傿儞僪僂傪昞帵偡傞 */
	ShowWindow( hMainWnd, nCmdShow ) ;
	UpdateWindow( hMainWnd ) ;

	return TRUE ;
}

LRESULT CALLBACK
MainWndFunc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	BOOL		rc ;
	LPTSTR		ptr ;
	HWND		hCtrl ;
	DWORD		i, cmd, type ;

	switch ( message ) {
	case WM_DESTROY:
		PostQuitMessage( 0 ) ;
		break ;
	case WM_COMMAND:
		cmd = GET_WM_COMMAND_ID( wParam, lParam ) ;
		switch ( cmd ) {
		case IDC_CBX_ROOT:
			if ( HIWORD( wParam ) == LBN_SELCHANGE ) {
				i = SendMessage( hCbxRoot, CB_GETCURSEL, 0, 0 ) ;
				if ( i == CB_ERR ) {
					break ;
				}
				hKeyRoot = RootKey[ i ] ;
				PostMessage( hWnd, WM_COMMAND, IDM_TOP, 0 ) ;
			}
			break ;
		case IDC_LBX_KEY:
			if ( HIWORD( wParam ) == LBN_DBLCLK) {
				PostMessage( hWnd, WM_COMMAND, IDM_RIGHT, 0 ) ;
			}
			break ;
		case IDC_LBX_VALUE:
			if ( HIWORD( wParam ) == LBN_DBLCLK ) {
				PostMessage( hWnd, WM_COMMAND, IDM_EDIT, 0 ) ;
			}
			break ;
		case IDM_TOP:
			*RegSubKey = 0 ;
			*KeyName = 0 ;
			ListupKeys( KeyName ) ;
			SetWindowText( hEdtKey, RegSubKey ) ;
			break ;
		case IDM_LEFT:
			if ( !*RegSubKey ) {
				MessageBeep( MB_ICONHAND ) ;
				break ;
			}
			ptr = _tcsrchr( RegSubKey, L'\\' ) ;
			if ( ptr == NULL ) {
				*RegSubKey = 0 ;
				*KeyName = 0 ;
			} else {
				*ptr = 0 ;
				ptr = _tcsrchr( RegSubKey, L'\\' ) ;
				if ( ptr == NULL ) {
					_tcscpy( KeyName, RegSubKey ) ;
					*RegSubKey = 0 ;
				} else {
					_tcscpy( KeyName, ptr + 1 ) ;
					*ptr = 0 ;
				}
			}
			ListupKeys( KeyName ) ;
			SetWindowText( hEdtKey, RegSubKey ) ;
			SetFocus( hLbxKey ) ;
			return FALSE ;
		case IDM_RIGHT:
			i = SendMessage( hLbxKey, LB_GETCURSEL, 0, 0 ) ;
			if ( i == LB_ERR ) {
				MessageBeep( MB_ICONHAND ) ;
				break ;
			} else if ( i == 0 ) {
				PostMessage( hWnd, WM_COMMAND, IDM_LEFT, 0 ) ;
				break ;
			}
			SendMessage( hLbxKey, LB_GETTEXT, i, (LPARAM) KeyName ) ;
			if ( ListupKeys( KeyName ) ) {
				SetWindowText( hEdtKey, RegSubKey ) ;
			}
			SetFocus( hLbxKey ) ;
			return FALSE ;
		case IDM_EDIT:
		case IDM_DELETE:
			i = SendMessage( hLbxVal, LB_GETCURSEL, 0, 0 ) ;
			if ( i == LB_ERR ) {
				MessageBeep( MB_ICONHAND ) ;
				break ;
			}
			SendMessage( hLbxVal, LB_GETTEXT, i, (LPARAM) KeyName ) ;
			ptr = _tcsstr( KeyName, TEXT(" : ") ) ;
			if ( ptr ) {
				*ptr = 0 ;
			}
			if ( cmd == IDM_EDIT ) {
				rc = EditValue( KeyName ) ;
			} else if ( cmd == IDM_DELETE ) {
				rc = DeleteValue( KeyName ) ;
			} else {
				rc = FALSE ;
			}
			if ( rc ) {
				ListupKeys( TEXT("") ) ;
			}
			SetFocus( hLbxVal ) ;
			break ;
		case IDM_ENTER:
			hCtrl = GetFocus() ;
			if ( hCtrl == hLbxVal ) {
				SendMessage( hWnd, WM_COMMAND, IDM_EDIT, 0 ) ;
			} else if ( hCtrl == hLbxKey ) {
				SendMessage( hWnd, WM_COMMAND, IDM_RIGHT, 0 ) ;
			}
			break ;
		case IDM_NEW_KEY:
			if ( NewKey() ) {
				ListupKeys( KeyName ) ;
				SetWindowText( hEdtKey, RegSubKey ) ;
			}
			SetFocus( hLbxKey ) ;
			break ;
		case IDM_DEL_KEY:
			i = SendMessage( hLbxKey, LB_GETCURSEL, 0, 0 ) ;
			if ( i == LB_ERR || i == 0 ) {
				MessageBeep( MB_ICONHAND ) ;
				break ;
			}
			SendMessage( hLbxKey, LB_GETTEXT, i, (LPARAM) KeyName ) ;
			if ( DeleteKey( KeyName ) ) {
				*KeyName = 0 ;
				ListupKeys( TEXT("") ) ;
			}
			SetFocus( hLbxKey ) ;
			break ;
		case IDM_IMPORT:
			if ( !ImportDlg( hWnd, Buffer ) ) {
				break ;
			} else if ( import_reg( Buffer ) ) {
				ListupKeys( TEXT("") ) ;
			} else {
				MessageBeep( MB_ICONHAND ) ;
			}
			break ;
		case IDM_EXPORT:
			i = SendMessage( hLbxKey, LB_GETCURSEL, 0, 0 ) ;
			if ( i == LB_ERR ) {
				MessageBeep( MB_ICONHAND ) ;
				break ;
			} else if ( i == 0 ) {
				KeyName[0] = 0 ;
			} else {
				SendMessage( hLbxKey, LB_GETTEXT, i, (LPARAM) KeyName ) ;
			}
			if ( !ExportKey( KeyName ) ) {
				MessageBeep( MB_ICONHAND ) ;
			}
			break ;
		case IDM_EXIT:
			SendMessage( hWnd, WM_CLOSE, 0, 0 ) ;
			break ;
		default:
			if ( cmd == IDM_NEW_DW ) {
				type = REG_DWORD ;
			} else if ( cmd == IDM_NEW_SZ ) {
				type = REG_SZ ;
			} else if ( cmd == IDM_NEW_MSZ ) {
				type = REG_MULTI_SZ ;
			} else if ( cmd == IDM_NEW_BIN ) {
				type = REG_BINARY ;
			} else {
				break ;
			}
			if ( NewValue( type ) ) {
				ListupKeys( TEXT("") ) ;
			}
			SetFocus( hLbxVal ) ;
			break ;
		}
		break ;
	case WM_HELP:
		/* About僟僀傾儘僌傪昞帵偡傞 */
		DialogBox( hInst, MAKEINTRESOURCE(IDD_DLG_ABOUT), hWnd, AboutDlgFunc ) ;
		break ;
	case WM_CLOSE:
		DestroyWindow( hWnd ) ;
		break;
	default:
		return DefWindowProc( hWnd, message, wParam, lParam ) ;
	}
	return 0 ;
}

BOOL
ListupKeys( LPCTSTR KeyName )
{
	DWORD	i, rc ;
	HKEY	hKey ;
	LONG	lret ;
	TCHAR	tchClassName[ MAX_PATH ] ;
	DWORD	dwcClassLen ;
	TCHAR	subkey[ MAX_PATH ] ;
	DWORD	dwcSubKeys, dwcMaxSubKey, dwcMaxClass, dwcValues ;
	DWORD	dwcMaxValueName, dwcMaxValueData, dwcSecDesc ;
	FILETIME	ftLastWriteTime ;

	if ( hKeyRoot == INVALID_HANDLE_VALUE ) {
		return FALSE ;
	}
	_tcscpy( subkey, RegSubKey ) ;
	if ( *subkey && *KeyName ) {
		_tcscat( subkey, TEXT("\\") ) ;
	}
	_tcscat( subkey, KeyName ) ;
	lret = RegOpenKeyEx( hKeyRoot, subkey, 0,
#ifdef	_WIN32_WCE
						0,
#else	/* _WIN32_WCE */
						KEY_ALL_ACCESS,
#endif	/* _WIN32_WCE */
						&hKey ) ;
	if ( lret != ERROR_SUCCESS ) {
		MessageBox( hMainWnd, TEXT("can't open the key"), szWinName, MB_OK ) ;
		return FALSE ;
	}
	dwcClassLen = MAX_PATH ;
	memset( tchClassName, 0, sizeof tchClassName ) ;
	RegQueryInfoKey( hKey,
					 tchClassName,
					 &dwcClassLen,
					 NULL,
					 &dwcSubKeys,
					 &dwcMaxSubKey,
					 &dwcMaxClass,
					 &dwcValues,
					 &dwcMaxValueName,
					 &dwcMaxValueData,
					 &dwcSecDesc,
					 &ftLastWriteTime ) ;

	SendMessage( hLbxKey, LB_RESETCONTENT, 0, 0 ) ;
	SendMessage( hLbxKey, LB_ADDSTRING, 0,
				(LONG) (*subkey ? TEXT("(Parent)") : TEXT("(Root)")) ) ;
	i = 0 ;
	do {
		DWORD	cbName = MAX_PATH ;
		TCHAR	keyName[ MAX_PATH ] ;

		memset( keyName, 0, sizeof keyName ) ;
		rc = RegEnumKeyEx( hKey, i ++, keyName, &cbName,
						   NULL, NULL, NULL, NULL ) ;
		if ( rc == (DWORD) ERROR_SUCCESS ) {
			SendMessage( hLbxKey, LB_ADDSTRING, 0, (LONG) keyName ) ;
		}
	} while ( rc == ERROR_SUCCESS ) ;
	SendMessage( hLbxVal, LB_RESETCONTENT, 0, 0 ) ;

	if ( dwcValues ) {
		for ( i = 0 ; i < dwcValues ; i ++ ) {
			DWORD	dwcValueName = MAX_PATH ;

			ValueSize = sizeof ValueData ;
			memset( ValueName, 0, sizeof ValueName ) ;
			memset( ValueData, 0, sizeof ValueData ) ;
			rc = RegEnumValue( hKey, i, ValueName, &dwcValueName,
							   NULL, &ValueType, ValueData, &ValueSize ) ;
			if ( rc != (DWORD) ERROR_SUCCESS && rc != ERROR_INSUFFICIENT_BUFFER ) {
				wsprintf( MessageBuf, TEXT( "based index = %d, rc = %d, ValueLen = %d\r\nError = %d" ),
						  i, rc, dwcValueName, GetLastError() );
				MessageBox( hMainWnd, MessageBuf, TEXT( "Debug" ), MB_OK );
				continue ;
			}
			GetValueStr( Buffer, sizeof Buffer / sizeof Buffer[0] ) ;
			SendMessage( hLbxVal, LB_ADDSTRING, 0, (LONG) Buffer ) ;
		}
	}
	RegCloseKey( hKey ) ;
	_tcscpy( RegSubKey, subkey ) ;
	return TRUE ;
}

BOOL
GetTypeStr( LPCTSTR *ptr )
{
	switch ( ValueType ) {
	case REG_BINARY:
		*ptr = TEXT("Binary") ;
		return TRUE ;
	case REG_DWORD:
		*ptr = TEXT("DWord") ;
		return TRUE ;
	case REG_SZ:
		*ptr = TEXT("SZ") ;
		return TRUE ;
	case REG_MULTI_SZ:
		*ptr = TEXT("Multi-SZ") ;
		return TRUE ;
	}
	return FALSE ;
}

BOOL
AppendStr( LPTSTR *dst, LPDWORD size, LPCTSTR src )
{
	DWORD	len, len2 ;

⌨️ 快捷键说明

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