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

📄 pcdmaccessreg.cpp

📁 《Windows CE 权威指南》(作者:(美)CHRIS MUENCH
💻 CPP
字号:
// PCDMAccessReg.cpp : Implementation of CPCDMAccessReg
#include "stdafx.h"
#include "PCDMDLL.h"
#include "PCDMAccessReg.h"

/////////////////////////////////////////////////////////////////////////////
// CPCDMAccessReg

// <BOOK_ADDON STEP3 Chapter 8.1.1> ************************************

STDMETHODIMP CPCDMAccessReg::ReadRegistryKey(BSTR Path, VARIANT *Value)
{
HKEY hKey,rhKey;
DWORD	tlValType,BufferSize;
PBYTE	bBuffer;
int i;
DWORD ret;
BSTR	tPath;

	VariantInit(Value);
	tPath=Path;
	if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,
                  TEXT("HKLM\\"),5,tPath,5)==CSTR_EQUAL)
		hKey=HKEY_LOCAL_MACHINE;
	else if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,
                             TEXT("HKCU\\"),5,tPath,5)==CSTR_EQUAL)
		hKey=HKEY_CURRENT_USER;
	else if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,
                             TEXT("HKCR\\"),5,tPath,5)==CSTR_EQUAL)
		hKey=HKEY_CLASSES_ROOT;
	else  // No valid Root Key specified
		return S_FALSE;

	i=lstrlen(tPath); while (tPath[i]!='\\' && i>0) i--;
	if (i==0)	// Path contains no ValueName
		return S_FALSE;
	tPath[i]=0;

	if (RegOpenKeyEx(hKey,&tPath[5],0,0,&rhKey)!=ERROR_SUCCESS)
		return S_FALSE;

	BufferSize=4096;
	bBuffer=(PBYTE)LocalAlloc(LMEM_FIXED|LMEM_ZEROINIT,BufferSize);
	RegQueryValueEx(rhKey,&tPath[i+1],0,&tlValType,bBuffer,
                      &BufferSize);

	ret=S_OK;
	switch (tlValType)
	{
		case REG_SZ:
				Value->vt=VT_BSTR;
				Value->bstrVal=SysAllocString((TCHAR*)bBuffer);
			break;
		case REG_DWORD:
				Value->vt=VT_I4;
				Value->lVal=(long)bBuffer;
			break;
		default:
				ret=S_FALSE;
			break;
	}
	RegCloseKey(rhKey);
	return ret;
}

STDMETHODIMP CPCDMAccessReg::WriteRegistryKey(BSTR Path, VARIANT Value)
{
HKEY hKey,rhKey;
LPDWORD result=NULL;
long	tlVal;
int		tLen,i;
DWORD	ret;
BSTR	tPath,keyName;

	if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,
                        TEXT("HKLM\\"),5,Path,5)==CSTR_EQUAL)
		hKey=HKEY_LOCAL_MACHINE;
	else if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,
                             TEXT("HKCU\\"),5,Path,5)==CSTR_EQUAL)
		hKey=HKEY_CURRENT_USER;
	else if (CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,
                             TEXT("HKCR\\"),5,Path,5)==CSTR_EQUAL)
		hKey=HKEY_CLASSES_ROOT;
	else  // No valid Root Key specified
		return S_FALSE;

	i=lstrlen(Path); while (Path[i]!='\\' && i>0) i--;
	if (i==0)	// Path contains no Value-Name
		return S_FALSE;

	tPath=&Path[5];
	keyName=&tPath[i-4];
	tPath[i-5]=0;
	
	if (RegOpenKeyEx(hKey,tPath,0,0,&rhKey)!=ERROR_SUCCESS)
	{
		RegCreateKeyEx(hKey,tPath,0,NULL,0,0,NULL,&rhKey,result);
	}
	if (rhKey==NULL) // Key could neither be created nor opened
		return S_FALSE;

	tLen=-1;
	ret=S_OK;
	switch (Value.vt)
	{
		case VT_I4:
				tlVal=Value.lVal; tLen=4;
			break;
		case VT_UI1: 
				tlVal=Value.bVal; tLen=4;
			break;
		case VT_I2:
				tlVal=Value.iVal; tLen=4;
			break;
		case VT_EMPTY:
				RegSetValueEx(rhKey,keyName,0,REG_SZ,
                                      (BYTE *)TEXT(""),0);
			break;
		case VT_BSTR:
				ret=RegSetValueEx(rhKey,keyName,0,REG_SZ,
                          (BYTE *)Value.bstrVal,
                          (lstrlen(Value.bstrVal)+1)*sizeof(TCHAR));
			break;
		default:
			ret=S_FALSE; // Unsupported Variant Type
	}
	if (tLen>0)
		RegSetValueEx(rhKey,keyName,0,REG_DWORD,(BYTE *)&tlVal,4);
	RegCloseKey(rhKey);
	return ret;
}
// </BOOK_ADDON STEP3 Chapter 8.1.1> ************************************

⌨️ 快捷键说明

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