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

📄 regview.cpp

📁 ce系统下面的一个浏览注册表的应用程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						  DWORD dwType)
** 功能:向列表视图插入一数据项。

** 输入:
		hWnd[in]:		父窗口句柄
		nCnt[in]:		插入数据项的行号索引
		pszName[in]:	插入的数据
		pbData[in]:		插入的数据
		dwDSine[in]:	pbData大小(in bytes)
		dwType[in]:		插入数据项的类型
** 输出:

** 作者:XZP
** 日期:07.9.6
** 备注:根据插入数据项类型的不同,全部转化为TCHAR型
************************************************************************/
int DisplayValue(HWND hWnd,int nCnt,LPTSTR pszName,PBYTE pbData,DWORD dwDSize,DWORD dwType)
{
	TCHAR szData1[20] = {0};
	TCHAR szTyle[256];
	int i = 0,len = 0;
	TCHAR *pszData = NULL;

	switch(dwType)
	{
	case REG_MULTI_SZ:
		_tcscpy(szTyle,_T("REG_MULTI_SZ"));
		pszData = (LPTSTR)pbData;
		break;

	case REG_EXPAND_SZ:
		_tcscpy(szTyle,_T("REG_EXPAND_SZ"));
		pszData = (LPTSTR)pbData;
		break;
		
	case REG_SZ:
		_tcscpy(szTyle,_T("REG_SZ"));
		pszData = (LPTSTR)pbData;
		break;
		
	case REG_DWORD:
		_tcscpy(szTyle,_T("REG_DWORD"));
		_stprintf(szData1,_T("%u"),*(UINT *)pbData);
		pszData = szData1;
		break;

	case REG_BINARY:
		_tcscpy(szTyle,_T("REG_BINARY"));
		// 注意分配内存是要*sizeof(TCHAR),这句话也搞了我半天,靠
		pszData = (TCHAR *)malloc((dwDSize*3+1)*sizeof(TCHAR));
		if(!pszData)
		{
			MessageBox(hWnd,_T("no enough memory"),_T("ERROE"),MB_OK | MB_TOPMOST);
			return 0;
		}
		pszData[0] = _T('\0');
		
		for(i=0;i<(int)dwDSize;i++)
		{
			_stprintf(&pszData[3*i],_T("%02X "),pbData[i]);
		}
		pszData[3*i] = _T('\0');
		//RETAILMSG(TRUE,(_T("i = %d, dwDSize = %d\n"),i,dwDSize));
		break;
		
	default:
		_tcscpy(szTyle,_T("Unknown type"));
		_stprintf(szData1,_T("Unknown type:%x"),dwType);
	}
	InsertLV(hWnd,nCnt,pszName,pszData,szTyle);
	
	if(pszData && (dwType == REG_BINARY))
	{
		free(pszData);
	}
	
	pszData = NULL;
	return 0;
}

/************************************************************************
** 函数:int PopupMenu(HWND hWnd,WORD idMenu,int nItem,int nFlag)
** 功能:创建一指定弹出式菜单(ID为idMenu的菜单的第nItem项)

** 输入:
		hWnd[in]:	主窗口句柄
		idMenu[in]:	菜单ID
		nItem[in]:	菜单索引号
		nFlag[in]:	标志位,控制弹出菜单的方向和位置
** 输出:

** 作者:XZP
** 日期:07.9.6
** 备注:TrackPopupMenu()显示一个弹出式菜单
************************************************************************/
int PopupMenu(HWND hWnd,WORD idMenu,int nItem,int nFlag)
{
	POINT point;
	HMENU hMenu,hSubMenu;
	
	//MessageBox(hWnd,_T("RightButton Up"),NULL,MB_OK|MB_TOPMOST);
	GetCursorPos(&point);
	hMenu = LoadMenu(hInst,MAKEINTRESOURCE(idMenu));
	hSubMenu = GetSubMenu(hMenu,nItem);	// 取得一个弹出式菜单的句柄,它位于菜单中指定的位置
	SetForegroundWindow(hWnd);
	if(nFlag == 1)
	{
		TrackPopupMenu(hSubMenu,		// 显示一个弹出式菜单
			TPM_RIGHTALIGN | TPM_BOTTOMALIGN,
			point.x,point.y,0,hWnd,NULL);
	}
	else
	{
		TrackPopupMenu(hSubMenu,
			TPM_LEFTALIGN | TPM_TOPALIGN,
			point.x,point.y,0,hWnd,NULL);
	}
	DestroyMenu(hMenu);					// 删除菜单并释放资源
	return 0;
}

/************************************************************************
** 函数:int ListVAddItem(HWND hWnd,HKEY hRoot,LPTSTR szKey,DWORD dwType)
** 功能:在指定注册表位置hKey中添加键值。

** 输入:
		hWnd[in]:	主窗口句柄
		hRoot[in]:	根键句柄
		szKey[in]:	指定健的完整路径
		dwType[in]:	新建键值类型,取以下值
			REG_MULTI_SZ
			REG_EXPAND_SZ
			REG_SZ
			REG_DWORD
			REG_BINARY
** 输出:
		0 - 成功;1 - 失败

** 作者:XZP
** 日期:07.9.9
** 备注:添加完了之后还要调用EnumValues刷新显示
************************************************************************/
int ListVAddItem(HWND hWnd,HKEY hRoot,LPTSTR szKey,DWORD dwType)
{
	TCHAR szDefName[MAX_PATH] = {0};	// 默认的键值名
	int nCnt = 0,rc,i = 1,nFlag = 1;
	DWORD dwNSize,dwDSize;
	TCHAR szName[256] = {0};			// 注册表健和键值的名称不能超过255个字符
	BYTE bData[1024] = {0};				// 键值的数据不能超过4K
	HKEY hKey;

	rc = RegOpenKeyEx(hRoot,szKey,NULL,NULL,&hKey);

	if(ERROR_SUCCESS != rc)
	{
		MessageBox(FindWindow(_T("RegView"),_T("RegView")),
			_T("ListVAddItem ERR1"),_T("ERR"),
			MB_OK | MB_TOPMOST | MB_ICONWARNING);
		if(hKey)
			RegCloseKey(hKey);
		return 1;
	}

	// 枚举指定子键下的所有键值,查看默认的新建键值名“新值 #%d”是否存在
	do 
	{
		_stprintf(szDefName,_T("新值 #%d"),i);
		dwNSize = sizeof(szName)/sizeof(TCHAR);
		dwDSize = sizeof(bData)/sizeof(BYTE);
		nCnt = 0;
		rc = RegEnumValue(hKey,nCnt,szName,&dwNSize,
					  NULL,NULL,bData,&dwDSize);
		while(rc == ERROR_SUCCESS)
		{
			if(_tcscmp(szDefName,szName) == 0)
			{
				i++;
				break;
			}
			dwNSize = sizeof(szName)/sizeof(TCHAR);
			dwDSize = sizeof(bData)/sizeof(BYTE);
			nCnt++;
			rc = RegEnumValue(hKey,nCnt,szName,&dwNSize,
					  NULL,NULL,bData,&dwDSize);
		}
		if(rc != ERROR_SUCCESS)
			nFlag = 0;
	} while(nFlag);
	
	switch(dwType)
	{
	case REG_MULTI_SZ:
	case REG_EXPAND_SZ:
	case REG_SZ:
		bData[0] = _T('\0');
		break;
	case REG_DWORD:
	case REG_BINARY:
		memset(bData,0,sizeof(bData));
		break;
	default:
		break;
	}

	dwDSize = sizeof(bData);
	if(RegSetValueEx(hKey,szDefName,NULL,dwType,bData,dwDSize) != ERROR_SUCCESS)
	{
		MessageBox(FindWindow(_T("RegView"),_T("RegView")),
			_T("ListVAddItem ERR2"),_T("ERR"),
			MB_OK | MB_TOPMOST | MB_ICONWARNING);
		if(hKey)
			RegCloseKey(hKey);
		return 1;
	}
	EnumValues(hWnd,hRoot,szKey);
	if(hKey)
		RegCloseKey(hKey);
	return 0;
}

/************************************************************************
** 函数:int ListVDeleteItem(HWND hWnd,HKEY hRoot,LPTSTR szKey)
** 功能:根据右边列表视图,删除指定健下的键值(可能不至少1个)

** 输入:
		hWnd[in]: 主窗口句柄
		hRoot[in]:根键句柄
		szKey[in]:指定健的完整路径:
** 输出:
		0 - 成功;1 - 失败

** 作者:XZP
** 日期:07.9.9
** 备注:
************************************************************************/
int ListVDeleteItem(HWND hWnd,HKEY hRoot,LPTSTR szKey)
{
	int nCount = 0,i,ncbName;
	UINT mask = 0;
	TCHAR szName[MAX_PATH];
	HWND hwndLV;
	HKEY hKey = NULL;
	
	if(ERROR_SUCCESS != RegOpenKeyEx(hRoot,szKey,NULL,NULL,&hKey))
	{
		MessageBox(FindWindow(_T("RegView"),_T("RegView")),
			_T("ListVDeleteItem ERR1"),_T("ERR"),
			MB_OK | MB_TOPMOST | MB_ICONWARNING);
		if(hKey)
			RegCloseKey(hKey);
		return 1;
	}
	
	if(IDCANCEL == MessageBox(hWnd,_T("确实要删除此数据吗?"),_T("确认数据删除"),
		MB_OKCANCEL | MB_TOPMOST | MB_ICONWARNING))
	{
		if(hKey)
			RegCloseKey(hKey);
		return 1;
	}
	
	ncbName = sizeof(szName);
	hwndLV = GetDlgItem(hWnd,ID_LISTV);
	nCount = ListView_GetItemCount(hwndLV);

	// 注意要倒着删
	for(i=nCount-1;i>=0;i--)
	{
		mask = ListView_GetItemState(hwndLV,i,LVIS_SELECTED);
		if(mask == LVIS_SELECTED)
		{
			ListView_GetItemText(hwndLV,i,0,szName,ncbName);
			if(ERROR_SUCCESS != RegDeleteValue(hKey,szName))
			{
				MessageBox(hWnd,_T("ListVDeleteItem ERR2"),_T("ERR"),
					MB_OK|MB_ICONWARNING|MB_TOPMOST);
				if(hKey)
					RegCloseKey(hKey);
				return 1;
			}
		}
	}
	EnumValues(hWnd,hRoot,szKey);
	if(hKey)
		RegCloseKey(hKey);
	return 0;
}

/************************************************************************
** 函数:int ListVReName(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName)
** 功能:重命名指定注册表子键的键值名称
		
** 输入:
		hWnd[in]:	主窗口句柄
		hRoot[in]:	键值的根键
		pszKey[in]:	键值对应的子键的完整路径
		pszName[in]:键值新名称
** 输出:
		0 - 成功;1 - 失败

** 作者:XZP
** 日期:07.9.9
** 备注:先检索重命名键值的名称在指定健下是否已存在,存在则直接退出,重命名失败!
************************************************************************/
int ListVReName(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName)
{
	HKEY hKey = NULL;
	int nCount = 0,i,nIndex = -1;
	TCHAR szName[MAX_PATH] = {0};	// 要被改的键值名称
	UINT mask;
	DWORD dwType,dwcbData;
	LPBYTE pbData = NULL;
	HWND hwndLV = GetDlgItem(hWnd,ID_LISTV);
	
	if(ERROR_SUCCESS != RegOpenKeyEx(hRoot,pszKey,NULL,NULL,&hKey))
	{
		MessageBox(hWnd,_T("ListVReName ERR1"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
		if(hKey)
			RegCloseKey(hKey);
		return 1;
	}
	
	// 检查重命名的键值名称在指定健下是否存在,并找出被选中的的键值的
	// 行索引,即要重命名的键值的行索引。
	nCount = ListView_GetItemCount(hwndLV);
	for(i=nCount-1;i>=0;i--)
	{
		ListView_GetItemText(hwndLV,i,0,szName,sizeof(szName));
		if(_tcscmp(szName,pszName) == 0)
		{
			MessageBox(hWnd,_T("重命名失败!指定的值名已存在,输入另一名称后重试。"),
				_T("重命名产生错误"),MB_ICONERROR|MB_TOPMOST|MB_OK);
			if(hKey)
				RegCloseKey(hKey);
			return 1;
		}
		if(nIndex == -1)	// 还没找到被选中的的键值的行索引,继续找,找到了,不再检索
		{
			mask = ListView_GetItemState(hwndLV,i,LVIS_SELECTED);
			if(mask = LVIS_SELECTED)
				nIndex = i;
		}	
	}

	ListView_GetItemText(hwndLV,nIndex,0,szName,sizeof(szName));
	// 从注册表中读取要重命名的键值的相关数据:类型和数据
	if(ERROR_SUCCESS == RegQueryValueEx(hKey,szName,NULL,&dwType,NULL,&dwcbData))
	{
		pbData = (LPBYTE)malloc(dwcbData);
		if(ERROR_SUCCESS != RegQueryValueEx(hKey,szName,NULL,&dwType,pbData,&dwcbData))
		{
			MessageBox(hWnd,_T("ListVReName ERR2"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
			if(hKey)
				RegCloseKey(hKey);
			return 1;
		}
	}
	// 从注册表中删除改键值
	if(ERROR_SUCCESS != RegDeleteValue(hKey,szName))
	{
		MessageBox(hWnd,_T("ListVReName ERR3"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
		if(hKey)
			RegCloseKey(hKey);
		return 1;
	}
	// 以新键值名称建立键值
	if(ERROR_SUCCESS != RegSetValueEx(hKey,pszName,NULL,dwType,pbData,sizeof(pbData)))
	{
		MessageBox(hWnd,_T("ListVReName ERR4"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
		if(hKey)
			RegCloseKey(hKey);
		return 1;
	}
	
	EnumValues(hWnd,hRoot,pszKey);
	if(hKey)
		RegCloseKey(hKey);
	return 0;
}

/************************************************************************
** 函数:int ListVModifyValue(HWND hWnd,
							  HKEY hRoot,
							  LPTSTR pszKey,
							  LPTSTR pszName,
							  LPBYTE pbData)
** 功能:修改指定键值的数据
		
** 输入:
		hWnd[in]:	主窗口句柄
		hRoot[in]:	键值的根键
		pszKey[in]:	键值对应的子键的完整路径
		pszName[in]:要修改的键值名称
		pbData[in]: 修改后的键值数据值
** 输出:
		0 - 成功;1 - 失败

** 作者:XZP
** 日期:07.9.11
** 备注:
************************************************************************/
int ListVModifyValue(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName,LPBYTE pbData)
{
	HKEY hKey;
	DWORD dwType;

	if(ERROR_SUCCESS != RegOpenKeyEx(hRoot,pszKey,NULL,

⌨️ 快捷键说明

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