2010-10-28 5 views
0

J'ai besoin de transmettre une valeur HRESULT à un programme en tant qu'argument de ligne de commande. J'avais l'intention de le faire en passant la valeur hexadécimale, par exemple:Passage de HRESULT en tant que chaîne sur la ligne de commande

>receiver.exe 0x80048836 

Je suis en train de convertir cette représentation de chaîne de retour dans un HRESULT en utilisant wcstol, par exemple:

HRESULT hr = wcstol(argv[2], NULL, 16); 

Cependant, la valeur de l'HRESULT d'origine est généralement supérieure à LONG_MAX, donc dans la ligne ci-dessus hr finit comme 0x7fffffff.

Alors, deux questions:

  1. Je pensais que HRESULTS étaient juste des entiers 32 bits? Donc je ne suis pas sûr de savoir comment je récupère un HRESULT supérieur à LONG_MAX. Il semble fonctionner correctement dans le programme d'origine, cependant (c'est-à-dire que le HRESULT ne déborde pas).

  2. Existe-t-il un moyen de contourner la restriction LONG_MAX de wcstol? Peut-être qu'une autre version de la fonction qui correspond à n'importe quelle taille entière HRESULT est réellement?

Merci!

Répondre

3

Découvrez wcstoul. http://msdn.microsoft.com/en-us/library/5k9xb7x1(v=VS.80).aspx Le HRESULT rentre dans 32 bits, mais avec l'exemple que vous avez donné, il utilise le bit le plus significatif, qui est considéré comme agissant comme un bit de signe pour les entiers signés. L'utilisation wcstoul l'adaptera dans un long unsigned.

LONG_MAX est 0x7FFFFFFF, le plus élevé qui peut tenir dans les 31 bits les moins significatifs, laissant le bit haut effacé, mais ULONG_MAX va jusqu'à 0xFFFFFFFF parce qu'il est non signé.

0

0x80048836 est supérieur à LONG_MAX pour votre système (2147483647L) qui est (0x7FFFFFFF). Selon msdn "lorsque la représentation provoquerait un débordement, auquel cas elle renvoie LONG_MAX ou LONG_MIN"

Dans votre cas, vous obtenez LONG_MAX comme résultat.

le type de retour de la fonction réelle est déclaré comme wcstol long (...). long n'est pas nécessairement de 32 bits, cela dépendra de votre système.

Dans ce cas, le type de retour est signé et 32 ​​bits de sorte que le plus grand nombre entier signé qui tiendra dans 32 bits est 7FFFFFFF.
00000000 à 7FFFFFFF est positif de 0 à LONG_MAX FFFFFFFF à 8.000.001 est négatif de -1 à LONG_MIN

Soit dit en passant, je crois "HRESULT hr = wcstol ..." serait incorrect puisque le type de retour de wcstol est (signé) long, mais HRESULT est ULONG (non signé longtemps). Cela peut être un problème selon la façon dont vous utilisez ces données.

Questions connexes