레지스트리에 키 정보를 등록하거나 키 정보를 가져오고 싶다면 "RegOpenKeyEx()" 함수를 이용하면 됩니다.
사용 방법은 다음과 같습니다.
1. 키 등록하기.
▶코드 보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
void CMFCSerialCommDlg::OnDropdownComboPortName()
{
HKEY hSerialCom;
LONG reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM", 0L, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hSerialCom);
if (reg == ERROR_SUCCESS )
{
wchar_t dir[MAX_PATH];
ZeroMemory(dir, sizeof(dir));
//GetCurrentDirectory(MAX_PATH, dir);
GetModuleFileName(NULL, dir, 256);
PathRemoveFileSpec(dir);
wchar_t *p_new_file = L"\\new_test.txt";
wcscat(dir, p_new_file);
rsize_t wcs_len = wcslen(dir) * 2;
// 레지스트리의 SERIALCOMM에 레지스터 등록
reg = ::RegSetValueEx(hSerialCom, L"new_test", 0, REG_SZ, (LPBYTE)L"COM99", wcs_len);
// 오픈한 키를 닫는다.
RegCloseKey(hSerialCom);
}
else {
MessageBox(L"키 열기 실패");
}
}
|
cs |
(내가 만든 Black_Kakao_ad 프로그램에서 기능 참고)
2. 키 읽어오기.
▶코드 보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
void CMFCSerialCommDlg::OnDropdownComboPortName()
{
HKEY hSerialCom;
LONG reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM", 0L, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hSerialCom);
if (reg == ERROR_SUCCESS )
{
LSTATUS res_status = ERROR_SUCCESS;
CString str_val;
CString str_value_name = L"new_test";// VALUENAME
DWORD buf_size = 0;
wchar_t atcvalue[MAX_PATH];
ZeroMemory(atcvalue, sizeof(atcvalue));
res_status = ::RegQueryValueEx(hSerialCom, str_value_name, NULL, NULL, NULL, &buf_size);
if (ERROR_SUCCESS == res_status) {
res_status = ::RegQueryValueEx(hSerialCom, str_value_name, NULL, NULL, (LPBYTE)atcvalue, &buf_size);
if (ERROR_SUCCESS == res_status) {
str_val.Format(L"%s", atcvalue);
AfxMessageBox(str_val);
}
else {
AfxMessageBox(str_val);
}
}
// 오픈한 키를 닫는다.
RegCloseKey(hSerialCom);
}
else {
MessageBox(L"키 열기 실패");
}
}
|
cs |
3. 등록되어 있는 키 정보 콤보 박스에 출력
▶코드 보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | void CMFCSerialCommDlg::OnDropdownComboPortName() { HKEY hSerialCom; LONG reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM", 0L, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hSerialCom); if (reg == ERROR_SUCCESS) { wchar_t buffer[MAX_PATH]; wchar_t data[MAX_PATH]; DWORD len, type, dataSize; long index; index = 0, len = dataSize = MAX_PATH; for ( ; ::RegEnumValue(hSerialCom, index, buffer, &len, NULL, &type, (unsigned char *)data, &dataSize) == ERROR_SUCCESS; index++) { len = dataSize = MAX_PATH; data[dataSize - 1] = NULL; if (wcsncmp(data, L"COM", 3) == 0) m_serial_port_list.AddString(data); } m_serial_port_list.SetCurSel(0); ::RegCloseKey(hSerialCom); } } | cs |
만약 위 코드대로 했는데 잘 안된다면 아래 글을 읽어 주세요.
경로명은 잘 적었지만 저 같은 경우 연결이 잘 됐습니다.
다른 경로명으로 진행해보면 잘 되는데 보안성을 좀더 높은 경로를 사용한다면 안열렸습니다. 그렇기 때문에
UAC 실행 수준을 높혀 줘야 합니다.
'MFC > MFC 관련 설명 모음' 카테고리의 다른 글
Visual Studio 프로젝트 버전 확인 하는 방법 (0) | 2022.01.07 |
---|---|
[MFC] 실행파일 아이콘 변경하는 방법 (0) | 2021.07.30 |
MFC Gride Control 추가2 - Cell Merge (0) | 2021.07.28 |
MFC Gride Control 추가. (0) | 2021.07.28 |
[MFC] 프로그램 하나만 실행 시키기. (0) | 2021.06.22 |