Iphlpapi.h ???

Résolu
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 31 août 2004 à 18:23
 masseur - 11 janv. 2005 à 18:41
Salut tout le monde !!
Lorsque g voulu compiler un code trouvé sur le web la compilateur ma sorit ki lne pouvé pas inclure Iphlpapi.h (et 2 ou 3 autre .h et .lib marchant avec). En cherchant sur le net je me suis apercu que j'etait pas le seul et je voulais savoir si vous les aviez sur Visual c++ V6 + SDK datant d a peu prés 6 mois !!!! ( normallmeent c'est microsoft qui les fournis )
Je crois qu elle ne sont que sur visual c++ NET, mais je n'en suis pas sur.

En fait je cherche a affacher le taux d upload/dowload de ma connection internet, si quelqun a un exaple ou une commande je suis prenneur !!!

Merci !!!!

21 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
4 sept. 2004 à 18:41
Salut,
Tous les Windows, sauf 95, ont "iphlpapi.dll" . La fonction GetIfTable() existe dans Windows 98,Me,NT,2000, XP et 2003.
Au niveau performances, la technique d'appel des fonctions d'une DLL par pointeurs est bien meilleure. Elle permet d'optimiser l'application au maximum. Les vrais pros de la programmation en C++ n'utilisent que cette méthode. C'est même précisé par Microsoft :" L'utilisation des fichiers H et LIB pour une DLL ne sert qu'à simplifier la programmation". Or, La simplification de la programmation se fait toujours au dépend des performances.
Je vais essayer ton code. Il me parait qu'il n'est pas fait pour être compilé avec Visual C++. Je vais le modifier puis le poster ici dès qu'il est fonctionnel.
A bientôt.
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 sept. 2004 à 02:27
Salut,
Je viens de finir et tester le petit code après quelques modifications. Ca marche NICKEL CHROME même sur windows 98.
C'est un projet console sous Visual C++ 6 :
//---------------------------------------------------------------------------------
#include <windows.h>
#include 
#include <stdio.h>

int main()
{

  typedef DWORD (WINAPI *PFONCTION)(PMIB_IFTABLE , PULONG, BOOL);

  PMIB_IFTABLE buffer ;
  MIB_IFROW donnees;
  HINSTANCE ip_help_handle = NULL;
  DWORD getiftable_rc;
  ULONG buf_size=0;

  ip_help_handle = LoadLibrary("iphlpapi.dll");
  if (ip_help_handle == NULL) return 1;
  
  PFONCTION get_if_table=(PFONCTION) GetProcAddress(ip_help_handle,"GetIfTable");
  if (get_if_table == NULL) 
  {
  FreeLibrary(ip_help_handle);
  return 1;
  }
  
  buffer = (MIB_IFTABLE*) malloc(sizeof(MIB_IFTABLE));
  getiftable_rc = get_if_table (buffer, &buf_size, TRUE);
  buffer = (MIB_IFTABLE *) malloc (buf_size);
  DWORD i;

  //Ici pourrait etre le debut d'une boucle infinie
  getiftable_rc = get_if_table (buffer, &buf_size, TRUE);
  for (i=1;idwNumEntries;i++)
  {
    donnees=buffer->table[i];
printf("\n%s%d\t%s%d\t%s%d","Interface:",i,"Upload:",donnees.dwOutOctets,"Download:",donnees.dwInOctets);
  }
  //Ici pourrait etre la fin de la boucle infinie

  printf ("\n\nTaper sur ENTREE pour quitter");
  getchar();
  FreeLibrary(ip_help_handle);
  return 0;
}


Tu peux mettre le 2eme appel de la fonction "get_if_table" et l'affichage dans une boucle infinie ou autre pour que ça tourne en continue. N'oublie pas de prévoir une sortie de cette boucle afin de controler ton programme. Ce code n'est qu'un noyau, à toi de l'améliorer et le perfectionner. Je ne savais pas que la fonction GetIfTable() est aussi intéressante. On apprend beaucoup sur cppfrance!
Si tu n'arrive pas à faire fonctionner ce code, on est là pour t'aider.
Bonne programmation.
3
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
31 août 2004 à 18:33
moi je suis sous VC++ 2003, et effectivement, j'ai le header... mais tu ne dois pas etre sans savoir qu'il y a une version de VC++ gratuite...
et au passage c'est quoi ce fameux code?
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
1 sept. 2004 à 03:15
Salut,
Ce n'est pas indispensable d'avoir "iphlpapi.h" et les autres fichiers qui vont avec. Tu peux utiliser directement les fontions de la DLL système "iphlpapi.dll" en les appelant avec des pointeurs. Pour cela, il suffit de se documenter sur les fonctions et les structures utilisées sur le site de Microsoft MSDN. Voici un exemple :
http://www.cppfrance.com/code.aspx?id=25462

J'avais téléchargé toute la platforme SDK juste pour avoir les fichiers dont vous parlez. Mais depuis que j'ai commencé à employer la méthode des pointeurs, je n'ai plus besoin de ces fichier .h et .lib qui ne sont d'ailleurs pas faciles à installer. Je me suis même rendu compte que la méthode des pointeurs donne de bien meilleurs résultats.
Bonne programmation!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
1 sept. 2004 à 04:21
Salut,
voici les headers et les libs de la sdk de fevrier 2003:
http://betouchi.free.fr/utile/headers_sdk2003.zip
http://betouchi.free.fr/utile/libs_sdk2003.zip
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
1 sept. 2004 à 19:04
Rien a faire g toujour le meme probleme en fait si je rajoute manuellement les headers et les librairie qui me manque g les message d 'erreur suivant


Compiling...
test.cpp
Linking...
   Creating library Debug/band.lib and object Debug/test.exp
test.obj : error LNK2001: unresolved external symbol _GetIfTable@12
test.obj : error LNK2001: unresolved external symbol __imp___TrackMouseEvent@4
Debug/band.dll : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

et pourant ces deux fonction sont d'aprés microsoft

"Header: Declared in Iphlpapi.h.
Library: Use Iphlpapi.lib."

La je v tester la manip de racpp pour voir !!!
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
1 sept. 2004 à 21:06
En fait je sait pas si c'est une bne idées vu que justement c pour programmer une dll (ki aurait besoin dun autre dll) et celle ci doit etre residente en memoire ( je vais pas m'en servir pour avoir des info au coup par coup mais pour une utlisation continue ) et je connais pas du tout cette technique mais je me demande si elle n'est pas plus lourde que de passer directement par les librairie de Vc++

Sinon LordBob ( Désolé pour le vent) ce code permet d'afficher le taux upload/download, j'ai fait des recheche sur le web et j'ai trouvé quedale a part un code (trop complexe pour moi et donc non modifié, pour tester, et je ne peux pas le compiler).

M'enfin je vais kan meme tester la technique de racpp quand j'aurait le temps vu que je ne sait meme pas kelle fonction je doit appeller dans la dll !!!!

En tout cas merci !!!!
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 sept. 2004 à 01:29
Salut,
Selon Microsoft, les fichiers ".h" et ".lib" ne servent qu'à simplifier la programmation avec , bien sûr, quelques inconvénients. La méthode des pointeurs, toujours selon Microsoft, permet à l'application de manipuler les DLL avec beaucoup plus de souplesse. Grâce à cette méthode tu peux charger la DLL en mémoire quand tu veux (et la décharger aussi). Ainsi ta DLL peut rester en mémoire aussi longtemps que ton application le veut. Il est vrai que cette méthode parait un peu compliquée, mais grâce à elle, on peut résoudre beaucoup de problèmes liés à l'emploi des ".h" et ".lib". Pour obtenir les meilleurs résultats, on est parfois obligés de recourir aux solutions compliquées. Depuis que j'utilise cette méthode, je n'ai plus aucun problème avec les DLL.
Tu ne peux pas mettre ton code ici? Je suis sûr que si on le regarde, on te trouvera une solution.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
3 sept. 2004 à 18:22
Alors au demarrage du code


ULONG o_get,o_snd,get,snd,gets,snds,o_snds,o_gets,s,xyz;
char titleb[1024];
PMIB_IFTABLE ifMIB;
char signal[900];
#define TBAND 150
o_get o_snd snd = get = gets = snds = o_gets = o_snds = xyz = s = 0;
GetIfTable(0,&s,1); 
ifMIB = (PMIB_IFTABLE)malloc((size_t)s);
SetTimer(hwnd,TBAND, 1000, (TIMERPROC) BANDR);



VOID CALLBACK BANDR(HWND hwnd,UINT message,UINT idTimer,DWORD dwTime)
{
    ULONG x;
x=0;
GetIfTable(ifMIB,&s,1);o_get get; o_snd snd;
get=snd=0;
while (x <= ifMIB->dwNumEntries) {get ifMIB->table[x].dwInOctets + get; snd ifMIB->table[x].dwOutOctets + snd;
x++;
}o_gets gets; o_snds snds;
if (xyz < 4) xyz++;if (xyz 4) { gets (get - o_get); snds = (snd - o_snd); }
}

VOID CALLBACK BANDS(HWND hwnd,UINT message,UINT idTimer,DWORD dwTime)
{   
char text[1024]; 
wsprintf(text,"%s [Band: %d dn %d up]", titleb, gets/1000, snds/1000); SetWindowText(mIRC_hwnd, text);
}


Il doit manquer quelques elements comme des initialisations mais le gros est la !!!
En fait la fonction renvois gets et snds et ceux ci sont mis a jour tout le temps grace au timer !!!

Par contre je galere pour trouver de l'aide pour utiliser la dll, jarrive pas a trouver les commandes incluses dans la dll sur le site de microsoft !!!
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
3 sept. 2004 à 19:12
C bon racpp g trouvé
En fait je decompose ma fonction en 2
1 une ki charge la dll et ki s oqupe du timer
2 une ki s oqupe de la renvoyer

Ce ke je cherchais c 'etait
get_if_table = (LPGETIFTABLE) GetProcAddress(ip_help_handle, "GetIfTable");
if (get_if_table == NULL)

En fait je viens de trouver un exmple qui utlise ta technique et je peu le compiler me reste plus ka l adapter a mon premier code mais ya po de raison pour que ca marche plus !!

Par contre est tu sur qu au niveau performance c'est pas trop critique parce que logiquement ca devrait etre moins rapide que de compiler directement le *.lib ???
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2004 à 19:16
Salut,
C'est la vitesse de download et d'upload que tu veux afficher ?

Sinon pour passer des octets aux kilo octets il faut diviser par 1024.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
3 sept. 2004 à 19:21
G oublié le code :p

Merci racpp ( si g bien trouvé un code ki parle de pointeur parce que la je decouvre ), je repasse dans quelques jours pour accepter la reponse, si tu as un dernier commentaire a mettre ......

DWORD download=0,download2=0,band=0;

  char *buffer = NULL;
  DWORD count;
  HINSTANCE ip_help_handle = NULL;
  DWORD getiftable_rc;
  ULONG buf_size;
  MIB_IFROW *ifr;
  MIB_IFTABLE *ift;
  DWORD ii=0,jj=0;

  ip_help_handle = LoadLibrary("iphlpapi.dll");
  if (ip_help_handle == NULL)
  return 0;
  get_if_table = (LPGETIFTABLE) GetProcAddress(ip_help_handle, "GetIfTable");
  if (get_if_table == NULL)
  return 0;
  buf_size = 0;
  getiftable_rc = (*get_if_table)((PMIB_IFTABLE) buffer, &buf_size, TRUE);
  if (getiftable_rc != ERROR_INSUFFICIENT_BUFFER)
  return 0;
  buffer = (char *) malloc(buf_size);
  if (buffer == NULL)
  return 0;
  memset(buffer, 0, buf_size);
  getiftable_rc = (*get_if_table)((PMIB_IFTABLE) buffer, &buf_size, TRUE);
  if (getiftable_rc != NO_ERROR)
  return 0;


Désolé de faire cinquantes post !!!
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
3 sept. 2004 à 19:29
Oui aardman !!
Une derniere question en utilisant les pointeur ca ne marchera que sur xp et NT, vu que seul eux on la dll.
En compilant il sera compatible sur tout les OS de windows ???
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 sept. 2004 à 19:36
Salut,
ben si les autres OS ont pas la dll, non.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
5 sept. 2004 à 18:56
Ouki ben la je peux plus rien dire, c décidé j utlise ta methode par contre ton code affiche les octect entrant et sortant total, donc il faut l'executer deux fois espacé d une seconde et faire la difference des deux mais ton code est vraiment plus clair et facile a comprendre, il ne me reste plus qu'a remettre le timer !!!

En tout cas il faudra que je me renseigne si ya pas d'autre dll qu'on pourrait utiliser avec ce principe !!!

En tout cas merci beaucoup !!!
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
5 sept. 2004 à 19:19
Salut,
Essaye quand meme de résoudre le probleme de link avec le lib, car si tu dois charger dynamiquement toutes les fonctions que tu utilises dans tes programes, t'es pas sorti de l'auberge.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 sept. 2004 à 22:52
Salut,
A ma connaissance, la technique des pointeurs marche avec toutes les DLL. Je l'ai fait avec une bonne trentaine sans le moindre problème. Il n'y a aucune raison pour que ça ne marche pas avec les autres.
aardman, il est vrai que si le nombre de fonctions est grand, il faudra définir un type de pointeur pour chacune d'elles. Pour préserver la clarté du code, il suffira de rassembler toutes ces définitions dans un fichier "h" puis l'inclure au projet. En général, on n' utilise que quelques fonctions dans la même DLL. Ce qui est plus courant, c'est l'utilisation de plusieurs DLL. Dans ce cas, la technique des pointeurs est beaucoup plus performante. Dans un liage statique ( avec LIB), l'application doit charger toutes les DLL au lancement de l'application. Ca ralentit beaucoup le démarrage du programme. Pire, si une DLL n'est pas accessible, le programme est arrêté. Avec le liage dynamique (par pointeurs), le programme ne charge que la DLL dont il a besoin et la libère quand elle n'est plus utile. Mieux, si une DLL n'est pas accessible, il peut la demander ou même l'installer depuis une ressource ou autre. Bref, avec la méthode des pointeurs, on maitrise mieux la gestion de nos DLL et leurs fonctions au lieu de laiser le système s'en occuper à sa façon. C'est une raison, parmi d'autres, pour chercher la performance et non la simplicité de la programmation.
A bientôt.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
5 sept. 2004 à 23:38
Salut,
racpp > as tu fais des tests de performance?

Globalement je suis d'accord avec toi quant aux avantages que tu cites, et il en existe d'autres (possiblité d'utiliser une fonction non documentée, possibilité de charger une dll dont on connait le chemin qu'au moment de l'execution, etc). Ce sont ces avantages qui font que je vais choisir de charger ma dll dynamiquement (car j'ai pas le choix en fait).
Par contre, je ne comprend pas vraiment l'interet de charger sa dll dynamiquement uniquement "pour rechercher la performance".
En fait j'ai du mal a croire qu'appeler GetProcAddress plein de fois soit plus rapide que laisser le loader faire son travail (qui travaille a un plus bas niveau).
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
6 sept. 2004 à 17:09
Salut,
Maitriser et manipuler les DLL avec souplesse est déjà une bonne performance. On n'a pas besoin de faire des tests poussés pour s'en rendre compte. Avec la technique des pointeurs, GetProcAddress() est appelée une seule fois pour chaque fonction seulement quand on en a besoin. Avec le liage statique (LIB), le loader , même en travaillant en très bas niveau, appelle cette même fonction (GetProcAddress) autant de fois qu'il y' a de fonctions dans le programme sans en avoir vraiment besoin. Tout cela, au chargement de l'application pour mettre toutes les adresses des fonctions dans une table prévue pour cela. Quand le nombre de fonctions et de DLLs est grand, le démarrage de l'application se trouve très ralenti. C'est quand même aberrant de charger toutes les DLLs et leurs fonctions au démarrage alors qu'on n'est même pas sûr qu'on va les utiliser. Quant à l'exécution des fonctions, c'est strictement pareil pour les deux méthodes, car elles sont appelées via des pointeurs et les paramètres passés dans la pile.
Pour faire des tests, tu peux créer deux projets (un pour chaque technique) qui utilisent les mêmes DLL et les mêmes fonctions. Il faut que le nombre de Dlls ou de fonctions soit grand, sinon on ne sentira pas trop de différence de temps de lancement des deux applications.
C'est très agaçant de lancer une application et de devoir attendre qu'elle soit prête pour une raison ou une autre.
A bientôt.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
7 sept. 2004 à 19:55
"Salut,
Essaye quand meme de résoudre le probleme de link avec le lib, car si tu dois charger dynamiquement toutes les fonctions que tu utilises dans tes programes, t'es pas sorti de l'auberge"

Ben je sais, c la premiere fois que ca me fait ca et je trouve pas sur le site de microsoft une SDK plus recente ( moi g vc++ 6 )
J'ai essayé
http://betouchi.free.fr/utile/headers_sdk2003.zip
http://betouchi.free.fr/utile/libs_sdk2003.zip
J'avais bien les fichiers mais ca ne marchait pas non plus !!!

Pour le moment je croise les doigts !!
0
Rejoignez-nous