- ///////////////////////
- // Fonction Thread
-
- UINT CEnumPCDlg::ThreadEnum(LPVOID pParam)
- {
- CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
- pDlg->ThreadFct(pDlg);
-
- return 0;
- }
-
- void CEnumPCDlg::ThreadFct(LPVOID pParam)
- {
- CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
-
- /////////////////////////////////
- // Lance la recherche des PCs
- // @: NULL pour tte les resources
-
- EnumPCConnect(NULL);
- }
-
-
- ///////////////////////////////////////////////
- // Fonction d'énumération des PCs
- // Actions :
- // 1/ Fonction recurente
- // 2/ Liste dans la listCtrl : m_dxListPC
- // 3/ Envoie de la variable Tmp correspondant au Nom du pc détecté
- // dans la fonction SearchIP(Tmp) qui va lui associé l'adres IP
- // 4/ Fin
-
- void CEnumPCDlg::EnumPCConnect(NETRESOURCE *nr)
- {
- HANDLE hEnum;
- DWORD Result;
-
- Result = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, nr, &hEnum);
-
- //NetResource = NULL : On enumere TOUTES les resources
- if( Result != NO_ERROR )
- {
- // Error (acces interdit a cette instance)
- AfxMessageBox("Impossible d'afficher la liste !");
- // Si on ne veut pas continuer l'enumeration
- return;
- }
-
- // Enumeration de toutes les resources
- DWORD Count = -1;
- DWORD BufferSize = 0;
- DWORD ReturnVal = 0;
-
- // Allocation de l'espace pour le tableau des resources reso
- NETRESOURCE *NetRes = (NETRESOURCE*) new char[1024];
- ZeroMemory( NetRes, sizeof( NETRESOURCE ) );
-
- while(1)
- {
- ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );
-
- if( ReturnVal == ERROR_MORE_DATA ) // On recalcul la taille du Buffer
- {
- Count = -1;
- delete[] NetRes;
- NetRes = ( NETRESOURCE* ) new char[ BufferSize ];
- ZeroMemory( NetRes, sizeof( NETRESOURCE ) );
- ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );
- }
- if(ReturnVal!=NO_ERROR)
- break;
-
- // Ajoute les resources dans la m_dxListConnect
- char Tmp[100];
-
- for (unsigned int i=0;i<Count;i++) // Verifie l'ensemble de toutes les resources trouver
- {
- if ( ( NetRes[i].lpRemoteName[0] == '\\' ) && ( NetRes[i].lpRemoteName[1] == '\\' ) )
- {
- // On prend ke celle comencant par '//' soit un ordinateur
- for ( unsigned int j = 0, k = 2; j < strlen( NetRes[i].lpRemoteName ); j++, k++ )
- Tmp[j] = NetRes[i].lpRemoteName[k];
-
- int nIndex = m_dxListPC.InsertItem(0,Tmp);
-
- // Lance la fonction SearchIP qui permet de déctecter l'adresse IP du destinataire
- SearchIP(Tmp, nIndex);
- }
- // Necessite pour la recurrence et trouver l'ensemble des pc
- if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER)==RESOURCEUSAGE_CONTAINER)
- EnumPCConnect(&NetRes[i]);
- }
-
- if( ReturnVal == ERROR_NO_MORE_ITEMS )
- {
- //Terminus tous le monde descend
- delete[] NetRes;
- WNetCloseEnum( hEnum );
- }
- }
- delete[] NetRes;
- WNetCloseEnum( hEnum );
- }
-
- ////////////////////////////////////////////////////
- // Fonction lancé par EnumPCConnect(...)
- // Permet de rechercher l'adresse IP du PC: Tmp
- // nIndex correspond au positionnemant dans la liste
-
- void CEnumPCDlg::SearchIP(char Tmp[], int nIndex)
- {
- HOSTENT* ip_resolue;
- SOCKADDR_IN valip;
- int compteur;
-
- char IPAdress[16];
-
- // Recuperation de l'ip du destinataire
- ip_resolue = gethostbyname(Tmp);
-
- if (ip_resolue != NULL) // si c'est NULL sans doute n'est on pas connecté.
- {
- // recuperation du dernier entier 'compteur' tel que ip_resolue->h_addr_list[compteur] n'est pas null
- for (compteur = 0; ip_resolue->h_addr_list[compteur+1] != NULL; compteur++)
- { }
-
- memcpy(&valip.sin_addr.s_addr, ip_resolue->h_addr_list[compteur], ip_resolue->h_length);
-
- strcpy(IPAdress, inet_ntoa(valip.sin_addr) );
- m_dxListPC.SetItemText(nIndex,1,IPAdress);
- }
- }
-
- //////////////////////////////////////////////////////////////
- // Fonction lancé par le bouton Actualiser de l'IHM
-
- void CEnumPCDlg::OnActualiser()
- {
- // Efface ttes les ressources énumérées dans la list
- m_dxListPC.DeleteAllItems();
-
- // Lance le thread d'énumération des PCs connectés au réseau
- AfxBeginThread( ThreadEnum,this);
- }
///////////////////////
// Fonction Thread
UINT CEnumPCDlg::ThreadEnum(LPVOID pParam)
{
CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
pDlg->ThreadFct(pDlg);
return 0;
}
void CEnumPCDlg::ThreadFct(LPVOID pParam)
{
CEnumPCDlg* pDlg = (CEnumPCDlg*) pParam;
/////////////////////////////////
// Lance la recherche des PCs
// @: NULL pour tte les resources
EnumPCConnect(NULL);
}
///////////////////////////////////////////////
// Fonction d'énumération des PCs
// Actions :
// 1/ Fonction recurente
// 2/ Liste dans la listCtrl : m_dxListPC
// 3/ Envoie de la variable Tmp correspondant au Nom du pc détecté
// dans la fonction SearchIP(Tmp) qui va lui associé l'adres IP
// 4/ Fin
void CEnumPCDlg::EnumPCConnect(NETRESOURCE *nr)
{
HANDLE hEnum;
DWORD Result;
Result = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, nr, &hEnum);
//NetResource = NULL : On enumere TOUTES les resources
if( Result != NO_ERROR )
{
// Error (acces interdit a cette instance)
AfxMessageBox("Impossible d'afficher la liste !");
// Si on ne veut pas continuer l'enumeration
return;
}
// Enumeration de toutes les resources
DWORD Count = -1;
DWORD BufferSize = 0;
DWORD ReturnVal = 0;
// Allocation de l'espace pour le tableau des resources reso
NETRESOURCE *NetRes = (NETRESOURCE*) new char[1024];
ZeroMemory( NetRes, sizeof( NETRESOURCE ) );
while(1)
{
ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );
if( ReturnVal == ERROR_MORE_DATA ) // On recalcul la taille du Buffer
{
Count = -1;
delete[] NetRes;
NetRes = ( NETRESOURCE* ) new char[ BufferSize ];
ZeroMemory( NetRes, sizeof( NETRESOURCE ) );
ReturnVal = WNetEnumResource( hEnum, &Count, NetRes, &BufferSize );
}
if(ReturnVal!=NO_ERROR)
break;
// Ajoute les resources dans la m_dxListConnect
char Tmp[100];
for (unsigned int i=0;i<Count;i++) // Verifie l'ensemble de toutes les resources trouver
{
if ( ( NetRes[i].lpRemoteName[0] == '\\' ) && ( NetRes[i].lpRemoteName[1] == '\\' ) )
{
// On prend ke celle comencant par '//' soit un ordinateur
for ( unsigned int j = 0, k = 2; j < strlen( NetRes[i].lpRemoteName ); j++, k++ )
Tmp[j] = NetRes[i].lpRemoteName[k];
int nIndex = m_dxListPC.InsertItem(0,Tmp);
// Lance la fonction SearchIP qui permet de déctecter l'adresse IP du destinataire
SearchIP(Tmp, nIndex);
}
// Necessite pour la recurrence et trouver l'ensemble des pc
if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER)==RESOURCEUSAGE_CONTAINER)
EnumPCConnect(&NetRes[i]);
}
if( ReturnVal == ERROR_NO_MORE_ITEMS )
{
//Terminus tous le monde descend
delete[] NetRes;
WNetCloseEnum( hEnum );
}
}
delete[] NetRes;
WNetCloseEnum( hEnum );
}
////////////////////////////////////////////////////
// Fonction lancé par EnumPCConnect(...)
// Permet de rechercher l'adresse IP du PC: Tmp
// nIndex correspond au positionnemant dans la liste
void CEnumPCDlg::SearchIP(char Tmp[], int nIndex)
{
HOSTENT* ip_resolue;
SOCKADDR_IN valip;
int compteur;
char IPAdress[16];
// Recuperation de l'ip du destinataire
ip_resolue = gethostbyname(Tmp);
if (ip_resolue != NULL) // si c'est NULL sans doute n'est on pas connecté.
{
// recuperation du dernier entier 'compteur' tel que ip_resolue->h_addr_list[compteur] n'est pas null
for (compteur = 0; ip_resolue->h_addr_list[compteur+1] != NULL; compteur++)
{ }
memcpy(&valip.sin_addr.s_addr, ip_resolue->h_addr_list[compteur], ip_resolue->h_length);
strcpy(IPAdress, inet_ntoa(valip.sin_addr) );
m_dxListPC.SetItemText(nIndex,1,IPAdress);
}
}
//////////////////////////////////////////////////////////////
// Fonction lancé par le bouton Actualiser de l'IHM
void CEnumPCDlg::OnActualiser()
{
// Efface ttes les ressources énumérées dans la list
m_dxListPC.DeleteAllItems();
// Lance le thread d'énumération des PCs connectés au réseau
AfxBeginThread( ThreadEnum,this);
}