문제 해결 - 현재 시스템 에 있 는 직렬 번호 얻 기

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

좋은 웹페이지 즐겨찾기