Работа с HResult, взаимодействия и связанных вещей в C # - PullRequest
3 голосов
/ 01 ноября 2009

Я работаю над проектом на C # для создания приложения форм. Я хотел бы использовать IFileDialog и другие функциональные возможности, которые являются частью собственного API-интерфейса Windows (или, тем не менее, они должны называться).

Начиная, я абсолютно ничего не знал о взаимодействии или Windows API. Я начинаю учиться, но иногда бывает трудно найти основную информацию по определенным аспектам. Поэтому у меня есть (возможно, тривиальные / глупые) вопросы:

HR-результаты используются часто. Как я понимаю, HResults - это не более чем 32-битный объект, в котором разные биты предоставляют информацию о результате определенных операций. В каком-то коде, который я нашел в Интернете, я часто вижу такие вещи, как int hres = -2147467259;. Будучи полным новичком, я пошел проверить, что это значит. -2147467259 - это 0xFFFFFFFF80004005, и в онлайновой документации на MSDN я вижу, что 0x80004005 означает E_FAIL или неопределенную ошибку У меня вопрос, что случилось с частью FFFFFFFF? Разве они не могли просто использовать int hres = 0x80004005? Может быть, это очень очевидно, и я полный нуб, но все же:)

Ответы [ 2 ]

2 голосов
/ 01 ноября 2009

FFFFFFFF часть, потому что ваш HResult отрицателен.

Так компьютеры хранят отрицательные числа, используя дополняющие два .

Проверьте этот расчет (мой акцент):
-2147467259 = 0xFFFFFFFF 80004005
-2147467259 + 2 ^ 32 (ролловер) = 2147500037 = 0x 80004005

0 голосов
/ 01 ноября 2009

На 32-битных платформах int имеет длину 32 бита, что составляет 4 байта 8 шестнадцатеричных цифр. Таким образом, E_FAIL будет 0x80004005, (это то, что показывает вставленный вами код. Если вы сбросите это значение на 64-битной машине, тогда оно займет вдвое больше памяти, и так как числа расширяются со знаком и ведущие 8 (двоичный 100) означает, что символьный бит равен 1, тогда он равен единице. 1111 в двоичном виде - это F в шестнадцатеричном формате, который приносит все F с, которые вы видите.

...