Brian C Hart Ответов: 3

Правильные макросы HIWORD (), LOWORD () для C#


Я использую VS2008 Express Edition на WinVista Business.

Я работаю с некоторым кодом, который дает мне OverflowExceptions повсюду, и я недостаточно знаком с типами данных, задействованными для решения этой проблемы. У меня есть подозрение, что это может привести к повторному сбою моей программы, но я не могу быть уверен.

Я скачал код для "файлового браузера C#" по адресу Файловый браузер.aspx-файл[^] и код вызывает статическое свойство HiWord, то есть распаковывает слово высокого порядка m.WParam, где m-структура данных, передаваемая переопределению WndProc() любой формы .NET.

Код таков
public static uint HiWord(IntPtr ptr)
{
    if (((uint)ptr & 0x80000000) == 0x80000000)
        return ((uint)ptr >> 16);
    else
        return ((uint)ptr >> 16) & 0xffff;
}


и исключение находится на линии if (((uint)ptr & 0x80000000) == 0x80000000).

Может ли кто-нибудь помочь мне выяснить, как правильно получить слово высокого порядка (это для сообщения, отправленного из контекстного меню, и я не могу использовать события Windows Forms, потому что я взаимодействую с оболочкой Windows)?

[Совет] когда вы включаете ссылку с помощью тегов <a href>, вам нужно поместить что-то между ней и </a>, иначе ссылка не будет показана.

Philippe Mori

Прежде чем копировать чужой код, убедитесь, что он работает и хорошо написан. Этот код слишком сложен. Нет никаких причин иметь какое-либо состояние в LoWord функция.

Brian C Hart

Могут ли люди перестать издеваться надо мной? Этот вопрос настолько стар, что мне уже наплевать на ответы на него.

3 Ответов

Рейтинг:
22

Alan N

Привет Брайан,
Я подозреваю, что проект изначально был скомпилирован с проверкой переполнения и что вы непреднамеренно изменили эту настройку.

Причина, по которой возникает исключение, заключается в том, что преобразование IntPtr в uint не так просто, как следует из кода. Это больше похоже на двойное преобразование через промежуточное целое число со знаком.

т.е. uint value = (uint)(int)ptr;

Если промежуточное значение отрицательно, то последующее преобразование в целое число без знака завершится неудачей при включенной проверке переполнения.

Алан.

[Править] интегрированная среда разработки делает хорошую работу, скрывая проверку переполнения вкл/выкл. В издании 2005 года он находится в разделе "свойства проекта".. Строить.. Передовой.


Brian C Hart

Это хороший момент, однако я использую VS2008 Express Edition. Есть ли способ отключить проверку переполнения с помощью VS2008 Express?

Рейтинг:
0

CPallini

Брайан К. Харт, доктор философии, написал:
return ((uint)ptr > & gt; 16);


Брайан К. Харт, доктор философии, написал:
return ((uint)ptr > & gt; 16) & 0xffff;


Какая разница?

:-)