API

레지스트리 쓰기, 삭제 함수

디버그정 2008. 8. 13. 03:36


BOOL SHRegWriteString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpName, LPCTSTR lpData)
{
 HKEY hkResult;
 DWORD dwDisp;
 if (RegCreateKeyEx(hKey, lpKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,NULL,&hkResult,&dwDisp)
  !=ERROR_SUCCESS)
  return FALSE;
 if (RegSetValueEx(hkResult, lpName, 0, REG_SZ,(LPBYTE)lpData,sizeof(TCHAR)*(lstrlen(lpData)+1))
  !=ERROR_SUCCESS)
  return FALSE;
 RegCloseKey(hkResult);
 return TRUE;
}


// 서브키까지 모두 삭제하는 함수 *코드 작성 : boy0
LONG SHRegDelete(HKEY hKey, LPCTSTR lpszSub)
{
 if(lstrlen(lpszSub)>=512){ // 길이 에러 감사
  TCHAR *lpszErr= new TCHAR[lstrlen(lpszSub)+64];
  wsprintf(lpszErr, _T("%s RegKey is too long. - SHRegDelete"), lpszSub);
  MessageBox(NULL, lpszErr, _T("error"), MB_ICONERROR);
  delete []lpszErr;
  return -1;
 }
  
    HKEY hNewKey;
    LONG lRes=ERROR_SUCCESS;
    DWORD dwSize;
    FILETIME ft;
 TCHAR szNewSub[512]={0};
  
 RegOpenKeyEx(hKey, lpszSub, 0, KEY_ALL_ACCESS, &hNewKey);
    while(TRUE) {
        dwSize = 512*sizeof(TCHAR);
        // 계속 키가 삭제 되므로 dwIndex는 항상 0을 넣어주어야 한다.
        lRes = RegEnumKeyEx(hNewKey, 0, szNewSub, &dwSize, NULL, NULL, NULL, &ft);
        if (lRes != ERROR_SUCCESS) break;
        lRes = SHRegDelete(hNewKey, szNewSub);
        if (lRes  != ERROR_SUCCESS) break;
    }
    RegCloseKey(hNewKey);
    return RegDeleteKey(hKey, lpszSub);
}


웹상에 돌아다니는 함수는 잘못된 부분이 있다.
size넣는 부분이다.
RegSetValueEx(hkResult, lpName, 0, REG_SZ,(LPBYTE)lpData,sizeof(TCHAR)*(lstrlen(lpData)+1))
에서와 같이  마지막 인수에 실제 데이터의 크기를 넣어줘야 한다.
그냥 문자열의 갯수+1를 넣어주면 안된다. 검증 결과 실 데이터의 크기를 넣어야 한다.
그렇지 않을 경우시 유니코드 컴파일시 ,,, 문자 하나는 2바이트의 크기이므로 반으로 짤리는 현상을
볼 수 있다.....;;;