중화사전망 - 서예자전 - C 언어로 Windows 레지스트리 키를 읽으려면 어떻게 해야 합니까?

C 언어로 Windows 레지스트리 키를 읽으려면 어떻게 해야 합니까?

이것은 표준 C++ 의 범주에 속하지 않습니다. windows API 를 호출하면 됩니다.

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 ("설정 실패: 대상 위치에 이런 키가 없습니다!" );