중화사전망 - 서예자전 - C 언어로 Windows 레지스트리 키를 읽으려면 어떻게 해야 합니까?
C 언어로 Windows 레지스트리 키를 읽으려면 어떻게 해야 합니까?
Win 95 및 NT 레지스트리는 시스템의 매우 중요한 부분입니다. 이러한 문제를 해결하기 위해 Win32 API 에는 Reg 함수 세트가 있습니다. 일반적인 읽기 및 쓰기 프로세스는 다음과 같습니다.
1. RegOpenKeyEx 또는 RegCreateKeyEx 함수를 사용하여 키를 열거나 만듭니다.
2. 이전 단계가 성공하면 RegQueryValueEx 를 사용하여 1 차 하위 구성요소의 값을 읽고, RegSetValueEx 를 사용하여 1 차 하위 구성요소를 설정하고, RegEnumKey 를 사용하여 모든 1 차 하위 구성요소를 가져오고, RegDeleteKey 를 사용하여 항목을 삭제합니다.
3. 작업 후 RegCloseKey 를 사용하여 닫습니다.
다음 프로그램은 HKEY _ 현재 _ 사용자 \ 소프트웨어 \ zeal soft studio \ askproftp \ lasttime 항목을 열고 WOL 하위 항목의 값을 읽습니다.
하이키 하이키;
Char SZ [256];
DWORD dwtype, sl = 256
RegOpenKeyEx(HKEY _ 현재 _ 사용자
"소프트웨어 \ \ zeal soft studio \ \ ask pro FTP \ \ last time" ,
NULL, KEY _ ALL _ ACCESS & amp;; Hkey);
RegQueryValueEx(hkey, "WOL", NULL & amp;; Dwtype, (LP byte)SZ & amp;; Sl);
RegCloseKey(HKEY););
MFC 프로그램은 CRegKey 클래스를 사용하여 레지스트리를 읽고 쓸 수 있습니다. VB 에서 API 를 호출하는 방법은 QA000226 "Windows 시스템 레지스트리에 액세스하는 방법" 을 참조하십시오.
등록 키 열기
LONG RegOpenKeyEx( HKEY hKey,//키 열기 핸들
LPCTSTR lpSubKey,//열려는 하위 이름의 주소
DWORD ulOptions, // reserved =0
REGSAM samDesired,//보안 액세스 마스크
PHKEY phkResult // 키 열기 핸들의 주소입니다
);
예:
HKEY HD;
Hd = HKEY _ LOCAL _ MACHINE
Char * regkey name = "software \ \ xy123 \ \ poker \ \";
LONG a=RegOpenKeyEx(hd, Regkeyname, 0, KEY_READ,& HD); //ERROR_SUCCESS 가 성공적으로 반환되었습니다. 그렇지 않으면 오류 코드가 반환됩니다.
등록 키 닫기
LONG RegCloseKey( HKEY hKey // 끌 키의 핸들);
예:
Reg closekey (HKEY _ local _ machine);
또는: RegCloseKey (HD);
등록 키 만들기
LONG RegCreateKeyEx( HKEY hKey,//키 열기 핸들
LPCTSTR lpSubKey,//하위 이름 주소
이중 예약됨,//예약됨 =0
LPTSTR lpClass,//클래스 문자열의 주소
DWORD dwOptions,//특수 옵션 플래그
REGSAM samDesired,//필요한 보안 액세스
Lpsecurity _ attributes lpsecurityattributes,//키 보안 구조의 주소
PHKEY phkResult,//핸들의 버퍼 주소 열기
LPDWORD lpdwDisposition // 폐기 값 버퍼의 주소);
예:
Char * sclass =// 지정된 클래스 이름이 null 입니다.
Dwordnbf = 0; //새 항목을 만들 것인지 기존 항목을 열 것인지를 나타내는 반환 값을 적용합니다. (REG_OPENED_EXISTING_KEY 는 항상 테스트 후에 반환됩니다.
LONG II=RegCreateKeyEx(hd, Regkeyname, 0, sclass, REG_OPTION_NON_VOLATILE,
KEY_READ|KEY_WRITE, NULL & amp;; Hd 및 amp nbf);
//REG_OPTION_NON_VOLATILE 은 항목이 영구적으로 예약되었음을 나타냅니다. 보안 구조는 NULL 을 나타내며 자동으로 기본값을 가져옵니다.
//ERROR_SUCCESS 가 성공적으로 반환되었습니다. 그렇지 않으면 오류 코드가 반환됩니다.
열거 키 값
LONG RegEnumValue( HKEY 키워드,//조회할 키워드의 핸들
DWORD dwIndex,//조회할 값의 색인
LPTSTR lpValueName,//값 문자열의 버퍼 주소
LPDWORD lpcbValueName,//값 버퍼 크기 주소
LPDWORD lpReserved, // reserved =NULL
LPDWORD lpType,//유형 코드의 버퍼 주소입니다
LPBYTE lpData,//값 데이터의 버퍼 주소입니다
LPDWORD lpcbData // 데이터 버퍼 크기 주소);
예:
Dworddinx = 0;
Char value name [70]; //숫자 이름 버퍼 할당
Strcpy (값 이름, "desk pattern"); //임의의 키 이름을 지정합니다.
DWORD nsize = 69// 숫자 이름 버퍼 크기
DWORD k = REG _ SZ// 는 데이터 유형을 나타냅니다.
부호 없는 문자 변수 [70]; //숫자 버퍼 할당
DWORD ncbvari = 69// 디지털 버퍼 크기
Dinx = 0;; //0 부터 시작
While((II=RegEnumValue(hd, dinx, valuename, & ampnsize, NULL & amp;; K, vari 및 ampncbvari))
! = 오류 _ 아니오 _ 추가 항목)
{
Dinx++;+; //index+1, 다음 값 준비
Nsize = 69// 원래 크기로 복원
Ncbvari = 69
}
성공 후 반환 값은 0 이고 변수는 다음과 같이 설정됩니다.
Valuename= 0 으로 끝나는 숫자 이름; 바탕 화면 색상
Nsize= 숫자 이름의 길이, 9
K=REG_SZ DeskColor 의 유형은 REG_SZ 입니다.
Vari= 키 값, 32768 DeskColor= "32768 ",
Ncbvari= 키 길이 REG_SZ (끝 0, =6 포함) ,
키 값을 읽습니다
LONG RegQueryValueEx( HKEY hKey,//조회할 키의 핸들
LPTSTR lpValueName,//조회할 값의 이름 주소
LPDWORD lpReserved,//예약됨
LPDWORD lpType,//값 유형의 버퍼 주소입니다
LPBYTE lpData,//데이터 버퍼의 주소
LPDWORD lpcbData // 데이터 버퍼 크기 주소);
예:
RegQueryValueEx(hd, valuename, NULL, & AMPK, vari, ampncbvari);
변수 정의 및 성공 후 각 변수의 설정은 RegEnumValueEx 와 동일합니다.
키 값 쓰기
LONG RegSetValueEx( HKEY hKey,//값을 설정할 키의 핸들
LPCTSTR lpValueName,//설정할 값의 이름
이중 예약됨,//예약됨
DWORD dwType,//값 유형의 플래그
상수 바이트 *lpData,//값 데이터의 주소
DWORD cbData // 값 데이터의 크기);
예:
Strcpy (값 이름, "헬로");
부호 없는 문자 변수 [10];
DWORD k = REG _ SZ
Strcpy((char*)vari, "1234567")
RegSetValueEx(hd, valuename, 0, k, vari, 7);
성공하면 포커 아래에 키 Hello: REG_SZ: 1234567 을 추가합니다.
정수 변수 쓰기:
Inthi = 8;
RegSetValueEx(pj, valuename, 0, REG_BINARY, (unsignedchar *) & 하이, 시제오프 (int));
성공하면 Poker 아래에 hello2: reg _ binary: 08 00000 키 값을 추가합니다.
Void AddEventSource ()
{
HKEY 홍콩;
DWORD dwData
우찰 슈부프 [80];
//소스 이름을 응용 프로그램 아래에 1 차 하위 구성요소로 추가합니다
이벤트 로그 레지스트리 키의 항목입니다.
If (regcreate key (HKEY _ local _ machine,
시스템 \ \ 현재 제어 세트 \ \ 서비스 \
\ \ eventlog \ \ application \ \ sampleapp ",& 홍콩))
ErrorExit ("레지스트리 키를 만들 수 없습니다." " );
//메시지 파일의 이름을 설정합니다.
Strcpy(szBuf, "%systemroot% \ \ system \ \ samplapp.dll");
//이벤트 메시지 파일 하위 항목에 이름을 추가합니다.
If (RegSetValueEx(hk,//하위 핸들
이벤트 메시지 파일,//값 이름
0,//는 0 이어야 합니다
REG_EXPAND_SZ,//값 유형
(LPBYTE) szBuf,//숫자 데이터에 대한 포인터
Strlen (szbuf)+1)//값 데이터의 길이
ErrorExit ("이벤트 메시지 파일을 설정할 수 없습니다." );
//TypesSupported 하위 항목에서 지원되는 이벤트 유형을 설정합니다.
DwData = 이벤트 로그 오류 유형 | 이벤트 로그 경고 유형 |
이벤트 로그 _ 정보 _ 유형
If (RegSetValueEx(hk,//하위 핸들
"TypesSupported ", // 값 이름
0,//는 0 이어야 합니다
REG_DWORD,//값 유형
(LP byte)& amp;; DwData,//값 데이터에 대한 포인터
Sizeof(DWORD))// 값 데이터의 길이
ErrorExit ("지원되는 유형을 설정할 수 없습니다." );
RegCloseKey (홍콩);
}
다음 코드는 레지스트리 부트 셸의 키 값을 c: \ dk1\ ATM \ shell \ exatmshell.exe 로 다시 작성합니다.
하이키 하이키;
장레즈
DWORD 데이터 유형 = REG _ SZ
부호 없는 문자 szvalue [_ max _ path];
Strcpy((char*)szvalue, "c: \ \ dk1\ \ ATM \ \ harp \ \ exatmshell ..
Res =:: regopenkeyex (HKEY _ local _ machine,
"소프트웨어 \ \ Microsoft \ \ Windows NT \ \ 현재 버전 \\Winlogon\\", 0,
키 쓰기 | 키 읽기. Hkey);
If(res! = 오류 _ 성공)
{
Afxmessagebox ("AAA");
반환;
}
Res = ::RegSetValueEx(hkey, "셸", 0, datatype, szvalue, strlen (lpcstr (szvalue)))
RegCloseKey(HKEY););
If(res==ERROR_SUCCESS)
* AfxMessageBox ("레지스트리 부트 셸의 키 값을 c: \ \ dk1\ \ ATM \ \ shell \ \ exactshell.eer 로 설정했습니다
기타
* AfxMessageBox ("설정 실패: 대상 위치에 이런 키가 없습니다!" );