문제 해결 - 현재 시스템 에 있 는 직렬 번호 얻 기
19136 단어 해제
본 고 는 오리지널 로 작가 와 출처 를 명확 하 게 밝 히 고 문장의 완전 성 을 확보 하 십시오 (본 성명 포함).
본 고 는 비정 기적 으로 수정 하고 보완 하 며 내용 이 정확 하도록 원문 으로 옮 겨 읽 는 것 을 권장 합 니 다.
본문 링크: http://www.cnblogs.com/wlsandwho/p/4210481.html
=======================================================================
최근 에 만 든 것 은 직렬 포트 를 사용 해 야 합 니 다. 인터페이스 를 초기 화 할 때 사용 가능 한 직렬 포트 목록 을 보 여 줍 니 다.
=======================================================================
처음에 나 는 설 비 를 매 거 하려 고 했 는데, 매우 번 거 로 운 것 같 았 다.
인터넷 에 서 는 i 가 1 부터 N 까지 하나씩 열 고 닫 으 라 고 많이 하 는데.........................................................
=======================================================================
생각해 보 니 레 지 스 트 에서 시작 하려 고 했 습 니 다. 모든 (사용 가능) 설 비 는 레 지 스 트 에 등록 해 야 하기 때 문 입 니 다.
방향 을 정 하고 자 료 를 준비 했다.
=======================================================================
1. 레 지 스 트 에 직렬 로 들 어 있 는 위치: HKEYLOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM。
2. 사용 하 는 주요 함수: RegEnumValue, 이것 은 MSDN http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k%28%22WINREG%2fREGENUMVALUE%22%29;k%28REGENUMVALUE%29;k%28DevLang-%22C%2B%2B%22%29;k%28TargetOS-WINDOWS%29&rd=true 을 참조 할 수 있 습 니 다. 마침 이 함수 가 예제 코드 http://msdn.microsoft.com/en-us/library/ms724256%28v=vs.85%29.aspx 를 보 여 주 었 습 니 다.
=======================================================================
다음은 마이크로소프트 코드 입 니 다.
// QueryKey - Enumerates the subkeys of key and its associated values.
// hKey - Key whose subkeys and values are to be enumerated.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383
void QueryKey(HKEY hKey)
{
TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name
DWORD cbName; // size of name string
TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name
DWORD cchClassName = MAX_PATH; // size of class string
DWORD cSubKeys=0; // number of subkeys
DWORD cbMaxSubKey; // longest subkey size
DWORD cchMaxClass; // longest class string
DWORD cValues; // number of values for key
DWORD cchMaxValue; // longest value name
DWORD cbMaxValueData; // longest value data
DWORD cbSecurityDescriptor; // size of security descriptor
FILETIME ftLastWriteTime; // last write time
DWORD i, retCode;
TCHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
// Get the class name and the value count.
retCode = RegQueryInfoKey(
hKey, // key handle
achClass, // buffer for class name
&cchClassName, // size of class string
NULL, // reserved
&cSubKeys, // number of subkeys
&cbMaxSubKey, // longest subkey size
&cchMaxClass, // longest class string
&cValues, // number of values for this key
&cchMaxValue, // longest value name
&cbMaxValueData, // longest value data
&cbSecurityDescriptor, // security descriptor
&ftLastWriteTime); // last write time
// Enumerate the subkeys, until RegEnumKeyEx fails.
if (cSubKeys)
{
printf( "
Number of subkeys: %d
", cSubKeys);
for (i=0; i<cSubKeys; i++)
{
cbName = MAX_KEY_LENGTH;
retCode = RegEnumKeyEx(hKey, i,
achKey,
&cbName,
NULL,
NULL,
NULL,
&ftLastWriteTime);
if (retCode == ERROR_SUCCESS)
{
_tprintf(TEXT("(%d) %s
"), i+1, achKey);
}
}
}
// Enumerate the key values.
if (cValues)
{
printf( "
Number of values: %d
", cValues);
for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++)
{
cchValue = MAX_VALUE_NAME;
achValue[0] = '\0';
retCode = RegEnumValue(hKey, i,
achValue,
&cchValue,
NULL,
NULL,
NULL,
NULL);
if (retCode == ERROR_SUCCESS )
{
_tprintf(TEXT("(%d) %s
"), i+1, achValue);
}
}
}
}
void __cdecl _tmain(void)
{
HKEY hTestKey;
if( RegOpenKeyEx( HKEY_CURRENT_USER,
TEXT("SOFTWARE\\Microsoft"),
0,
KEY_READ,
&hTestKey) == ERROR_SUCCESS
)
{
QueryKey(hTestKey);
}
RegCloseKey(hTestKey);
}
실행 해 보 니 이 코드 는 두 가지 기능 이 있 었 고 나 는 지금 두 번 째 기능 만 필요 하 다.
그래서 코드 를 조금 만 고치 면 됩 니 다.
1 void QueryKey(HKEY hKey)
2 {
3 TCHAR achClass[MAX_PATH] = TEXT("");
4 DWORD cchClassName = MAX_PATH;
5 DWORD cSubKeys=0;
6 DWORD cbMaxSubKey;
7 DWORD cchMaxClass;
8 DWORD cValues;
9 DWORD cchMaxValue;
10 DWORD cbMaxValueData;
11 DWORD cbSecurityDescriptor;
12 FILETIME ftLastWriteTime;
13
14 DWORD i, retCode;
15
16 TCHAR achValue[MAX_VALUE_NAME];
17 DWORD cchValue = MAX_VALUE_NAME;
18 BYTE byteData[MAX_VALUE_NAME];
19 DWORD dwData=MAX_VALUE_NAME;
20
21 retCode = RegQueryInfoKey(
22 hKey,
23 achClass,
24 &cchClassName,
25 NULL,
26 &cSubKeys,
27 &cbMaxSubKey,
28 &cchMaxClass,
29 &cValues,
30 &cchMaxValue,
31 &cbMaxValueData,
32 &cbSecurityDescriptor,
33 &ftLastWriteTime);
34
35 if (cValues)
36 {
37 for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++)
38 {
39 cchValue = MAX_VALUE_NAME;
40 achValue[0] = '\0';
41 dwData=MAX_VALUE_NAME;
42 byteData[0] = '\0';
43
44 retCode = RegEnumValue(hKey, i,
45 achValue,
46 &cchValue,
47 NULL,
48 NULL,
49 byteData,
50 &dwData);
51
52 if (retCode == ERROR_SUCCESS )
53 {
54 CString strCOM= (wchar_t*)byteData;
55 }
56 }
57 }
58 }
54 번 째 줄 에서 나 는 원 하 는 결 과 를 얻 었 다.
=======================================================================
앞으로 편리 하 게 사용 할 수 있 도록 클래스 에 밀봉 할 수 있 습 니 다. 예 를 들 어 CEnumSerialPortWLS.
제 CEnum SerialPortWLS 에 set 가 있 습 니 다. 이렇게...
1 CString strCOM= (wchar_t*)byteData;
뒤에 인 스 트 넣 으 면 돼 요.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
주의 할 점 은 RegEnumValue 함수 가 되 돌아 오 는 byteData 가 UNICODE 이기 때문에 직접 강제 변환 해서 사용 할 수 있다 는 점 이다.
이곳 에서 제 가 실 수 를 했 습 니 다. 저 는 항상 TCHAR 같은 매크로 를 사용 하고 wchar 를 사용 하지 않 습 니 다.t. 이런 것들 때문에 얻 은 잘못된 결과 에 대해 한동안 곤 혹 스 러 웠 습 니 다.
앞으로 기억 하 세 요.
명확 한 강제 유형 전환 은 명확 한 유형 을 사용 해 야 합 니 다.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 치욕의 벽 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
http://www.cnblogs.com/wlsandwho/p/4206472.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LeetCode - 503. 다음 더 큰 요소 II (Next Greater Element II) [중간] - 분석 및 코드 (Java)순환 배열 (마지막 요소 의 다음 요 소 는 배열 의 첫 번 째 요소) 을 지정 하고 모든 요소 의 다음 요 소 를 출력 합 니 다.숫자 x 의 다음 더 큰 요 소 는 배열 에 따라 순 서 를 옮 겨 다 니 는 것 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.