Iphlpapi.h ??? [Résolu]

SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 31 août 2004 à 18:23 - Dernière réponse :  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 !!!!
Afficher la suite 

21 réponses

Répondre au sujet
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 4 sept. 2004 à 18:41
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de racpp
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 5 sept. 2004 à 02:27
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de racpp
cs_LordBob 2865 Messages postés samedi 2 novembre 2002Date d'inscription 11 mai 2009 Dernière intervention - 31 août 2004 à 18:33
0
Utile
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..."
Commenter la réponse de cs_LordBob
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 1 sept. 2004 à 03:15
0
Utile
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!
Commenter la réponse de racpp
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 1 sept. 2004 à 04:21
0
Utile
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
Commenter la réponse de cs_aardman
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 1 sept. 2004 à 19:04
0
Utile
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 !!!
Commenter la réponse de SnOOpss
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 1 sept. 2004 à 21:06
0
Utile
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 !!!!
Commenter la réponse de SnOOpss
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 2 sept. 2004 à 01:29
0
Utile
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.
Commenter la réponse de racpp
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 3 sept. 2004 à 18:22
0
Utile
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 !!!
Commenter la réponse de SnOOpss
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 3 sept. 2004 à 19:12
0
Utile
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 ???
Commenter la réponse de SnOOpss
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 3 sept. 2004 à 19:16
0
Utile
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.
Commenter la réponse de cs_aardman
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 3 sept. 2004 à 19:21
0
Utile
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 !!!
Commenter la réponse de SnOOpss
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 3 sept. 2004 à 19:29
0
Utile
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 ???
Commenter la réponse de SnOOpss
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 3 sept. 2004 à 19:36
0
Utile
Salut,
ben si les autres OS ont pas la dll, non.
Commenter la réponse de cs_aardman
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 5 sept. 2004 à 18:56
0
Utile
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 !!!
Commenter la réponse de SnOOpss
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 5 sept. 2004 à 19:19
0
Utile
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.
Commenter la réponse de cs_aardman
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 5 sept. 2004 à 22:52
0
Utile
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.
Commenter la réponse de racpp
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 5 sept. 2004 à 23:38
0
Utile
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).
Commenter la réponse de cs_aardman
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 6 sept. 2004 à 17:09
0
Utile
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.
Commenter la réponse de racpp
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 7 sept. 2004 à 19:55
0
Utile
"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 !!
Commenter la réponse de SnOOpss

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.

Iphlpapi.h ??? - page 2