📄 pcdmaccessreg.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 + -