Voici un petit scripte qui permet de :
- Détecter tous les ports COM existant série et USB via la base de registre.
- De tester si les ports COM sont occuper.
(Fonction Supplémentaire : Detection de votre systeme electronique (dans le zip))
Source / Exemple :
// situation de la clé
const HKEY HK=HKEY_LOCAL_MACHINE;
// chemin d'accès aux clés
const char * cle="HARDWARE\\DEVICEMAP\\SERIALCOMM";
//ouverture de la base de registre
HKEY Retour;
RegOpenKeyEx(HK,cle,0,KEY_ALL_ACCESS,&Retour);
//définition des variables local
char * NomVal; //variable nécessaire pour l'ouverture des clés de la base de registre
NomVal = new char[25];
char * Valeur;
Valeur = new char[25];
unsigned long NNom=25;
unsigned long NVal=25;
unsigned long Ty=0;
CString PortCom; //stock les infos sur les ports COM
int n=0; //variable d'incrémentation pour le parcoure de la base de registre
long Ret; // retour d'erreur de la base de registre
CString temp; //vatiable temporaire
void* hSer; // création de l'objet com
//parcoure la partie concerner de la base de registre
do
{
//ouverture d'une clé
Ret =RegEnumValue( Retour,n,(char *)NomVal,&NNom,0,&Ty,(unsigned char *)Valeur,&NVal );
temp="";
//si pas d'erreur
if (Ret != ERROR_NO_MORE_ITEMS)
{
PortCom="";
//1)-- -> valeur : com1 , com2...
PortCom =PortCom+Valeur;
//2)-- -> type de port : com , usb
temp=NomVal;
if (temp.Find("Serial") !=-1)
PortCom=PortCom+" | COM";
else if (temp.Find("VCP")!=-1)
PortCom=PortCom+" | USB";
else
PortCom=PortCom+" | Inconue";
//3)-- ->recupere le numero du port -> 1, 2...
temp=Valeur;
temp=temp.Right(temp.GetLength()-3);
PortCom =PortCom+" | "+temp;
//4)-- ->état du port -> libre, occuper
//A)- ouvre le port
hSer = CreateFile(Valeur,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
//B)- vérifie que le port série est bien ouvert!
if(hSer == INVALID_HANDLE_VALUE)
{ // systeme ocuuper
PortCom=PortCom+" | Occuper";
}
else
{ // system libre
PortCom=PortCom+" | Libre";
//c)- fermeture du port com
if(hSer!=NULL)
CloseHandle(hSer);
}
//5)-- -> affichage
UpdateData(true);
m_edit= m_edit+PortCom+"\r\n";
UpdateData(false);
}
n++;
} while (Ret != ERROR_NO_MORE_ITEMS);
//fermeture de la base de registre
RegCloseKey(Retour);
Conclusion :
compilé avec Visual Studio C++ .NET
code commenté!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.