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바이트의 크기이므로 반으로 짤리는 현상을
볼 수 있다.....;;;
'API' 카테고리의 다른 글
## SendMessage & PostMessage ## (0) | 2008.08.15 |
---|---|
윈도우 프로시져 (1) | 2008.08.15 |
함수,변수 표기법(헝가리안) (2) | 2008.08.15 |
#if defined(_UNICODE) || defined(UNICODE) 디파인 or 연결시 (0) | 2008.08.08 |
DialogBoxIndirect 샘플 수정 및 코딩 최적화 작업 (1) | 2008.08.06 |
DialogBoxIndirect 예제 심플 (2) | 2008.08.06 |
대화상자와 등록 정보 시트 소프트웨어 (0) | 2008.08.06 |