Передача HRESULT в виде строки в командной строке - PullRequest
0 голосов
/ 29 октября 2010

Мне нужно передать значение HRESULT программе в качестве аргумента командной строки.Я намеревался сделать это, передав шестнадцатеричное значение, например:

>receiver.exe 0x80048836

Я пытаюсь преобразовать это строковое представление обратно в HRESULT, используя wcstol, например:

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

Однако значение исходного HRESULT обычно больше, чем LONG_MAX, поэтому в строке выше hr заканчивается как 0x7fffffff.

Итак, два вопроса:

  1. Я думал, что HRESULTS были просто 32-разрядными целыми числами?Так что я не уверен, как получить HRESULT больше, чем LONG_MAX.Похоже, что он отлично работает в исходной программе (т. Е. HRESULT не переполняется).

  2. Есть ли способ обойти ограничение LONG_MAX в wcstol?Может быть, другая версия функции, которая соответствует целому размеру, который на самом деле равен HRESULT?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

Выезд wcstoul.http://msdn.microsoft.com/en-us/library/5k9xb7x1(v=VS.80).aspx HRESULT вписывается в 32 бита, но в приведенном вами примере он использует самый значимый бит, который считается действующим как знаковый бит для целых чисел со знаком.Использование wcstoul поместит его в длинную без знака.

LONG_MAX равно 0x7FFFFFFF, самое высокое, которое может уместиться в 31 младшем значащем бите, оставляя верхний бит очищенным, но ULONG_MAX увеличиваетсяна 0xFFFFFFFF, потому что он без знака.

0 голосов
/ 29 октября 2010

0x80048836 больше, чем LONG_MAX для вашей системы (2147483647L), что равно (0x7FFFFFFF).Согласно msdn "когда представление вызовет переполнение, в этом случае оно возвращает LONG_MAX или LONG_MIN"

Так что в вашем случае вы получите LONG_MAX, возвращенный как ваш результат.

фактический тип возвращаемого значения функцииобъявляется как длинный wcstol (...).long не обязательно имеет размер 32 бита, это будет зависеть от вашей системы.

В этом случае тип возвращаемого значения является знаковым и 32-битным, поэтому наибольшее целое число со знаком, которое поместится в 32-битном формате, равно 7FFFFFFF.От 1 до LONG_MIN

Между прочим, я считаю, что «HRESULT hr = wcstol ...» будет неправильным, поскольку тип возвращаемого значения wcstol - это (подписано) long, но HRESULT имеет значение ULONG (без знака long).Это может быть проблемой в зависимости от того, как вы используете эти данные.

...