本文共 1416 字,大约阅读时间需要 4 分钟。
原来C++Builder6在XP下获取串口的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void TTools::GetSystemPortList(TStringList * pList) { TRegistry *regkey= new TRegistry(); pList->Clear(); regkey->RootKey=HKEY_LOCAL_MACHINE; TStringList *KeyNames; KeyNames= new TStringList(); regkey->OpenKey( "HARDWARE\\DEVICEMAP\\SERIALCOMM" , false ); regkey->GetValueNames(KeyNames); for ( int i=0;i<=(KeyNames->Count-1);i++) { AnsiString a = regkey->ReadString(KeyNames->Strings[i]); pList->Add(a); } regkey->CloseKey(); delete KeyNames; delete regkey; } |
这种方法,编译好的程序,在Win10下无效,需要管理员权限执行才行.
在Win10直接用API读注册表获取,代码如下: 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 | void TTools::GetSystemAllPort(TStringList * pList) { HKEY hKey; DWORD result; TCHAR valueName[255]; TCHAR data[255]; DWORD valueNameSize,dataSize; DWORD i; result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm" , NULL, KEY_READ, &hKey); //读取注册表串口信息 if (ERROR_SUCCESS == result) { for (i=0;i<256 ;i++) { valueNameSize = dataSize = sizeof (valueName) / sizeof ( TCHAR ); result = RegEnumValue(hKey, i, valueName, &valueNameSize, NULL, NULL, ( LPBYTE )data, &dataSize); if (ERROR_NO_MORE_ITEMS == result ) { break ; } else { pList->Add(( char *)data); } } } else { ::MessageBox(0, "PORT ERROR!" , "Error" ,0); } RegCloseKey(hKey); } |