2012-06-04 4 views
1

Pour:taille du tampon pour GetAdaptersInfo

DWORD GetAdaptersInfo(
    __out PIP_ADAPTER_INFO pAdapterInfo, 
    __inout PULONG pOutBufLen 
); 

La description de pOutBufLen est la suivante:

pOutBufLen

[in, out] Pointeur à la taille, en octets, du buffer indiqué par le paramètre pAdapterInfo. Si cette taille est insuffisante pour contenir les informations de l'adaptateur, cette fonction remplit la mémoire tampon avec la taille requise et renvoie un code d'erreur ERROR_BUFFER_OVERFLOW.

Maintenant, ma question est que comment pouvons-nous savoir quelle devrait être la taille de la mémoire tampon, c'est-à-dire pOutBufLen? Et quelle est la bonne façon si nous avons plus de 16 cartes réseau?

Source msdn

Répondre

2

La manière habituelle de l'utiliser est quelque chose comme ceci:

IP_ADAPTER_INFO *buffer= NULL; 
ULONG length = 0; 

// call with length of 0. It'll fail, but tell us needed size. 
GetAdaptersInfo(buffer, &length); 

// allocate space needed. 
buffer = malloc(length); 

// Call again, with necessary size. 
if (buffer != NULL) 
    GetAdaptersInfo(bufer, &length); 

Au moins en théorie, vous devriez vraiment faire cela dans une boucle while, ou quelque chose sur cet ordre - appelez, attribuez, appelez à nouveau et continuez à réaffecter et à rappeler jusqu'à ce qu'il réussisse. Cela va le laisser (éventuellement) réussir, même si l'utilisateur arrive à brancher une carte réseau juste entre les premier et deuxième appels, donc même si vous avez alloué l'espace qu'il pensait être nécessaire, il devient inadéquat avant de pouvoir faire le second appel.

+0

oh, donc la fonction fonctionne de deux façons. bonne réponse merci :) –

+0

N'oubliez pas de lancer le retour de malloc car il est marqué C++. –

+0

Oui je sais, merci pour le headsup :) (PIP_ADAPTER_INFO) malloc (dwBufLen) i.e si nous utilisons PIP_ADAPTER_INFO au lieu de IP_ADAPTER_INFO –

Questions connexes