Автор Тема: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem  (Прочитано 4821 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Нашел ошибку в функции
Код: AutoIt [Выделить]
В ней есть неправильная строка:
Код: AutoIt [Выделить]
If $aResult[0] = 0 Then Return SetError(10, 0, False)

Должно быть:
Код: AutoIt [Выделить]
If $aResult[0] = -1 Then Return SetError(10, 0, False)

Эта ошибка присутствует в версиях от 3.3.6.1 до 3.3.10.2 (других у меня нет).
Справка англ. и рус.

PS
Не понятно мне, почему возвращаемое значение API функции EnableMenuItem BOOL, если она может вернуть и -1, и 0, и 1, и 2, и т.д.?  :think:
« Последнее редактирование: Январь 27, 2014, 10:05:35 от madmasles »

Русское сообщество AutoIt

[Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Отправлен: Январь 27, 2014, 09:34:31 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2712
  • Репутация: 1137
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #1, Отправлен: Январь 27, 2014, 14:36:21 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790

  • Автор темы
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #2, Отправлен: Январь 27, 2014, 14:40:45 »
AZJIO  [?]
Цитировать
Отписал
Спасибо.

Оффлайн asdf8 [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 560
  • Репутация: 151
    • Награды
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #3, Отправлен: Январь 27, 2014, 15:32:40 »
madmasles  [?]
Цитировать
Не понятно мне, почему возвращаемое значение API функции EnableMenuItem BOOL, если она может вернуть и -1, и 0, и 1, и 2, и т.д.?

Из справки к DllCall :
BOOL - 32 битное целое

Русское сообщество AutoIt

Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #3 Отправлен: Январь 27, 2014, 15:32:40 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790

  • Автор темы
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #4, Отправлен: Январь 27, 2014, 15:41:15 »
OffTopicasdf8  [?]
Цитировать
Из справки
Всегда считал, что тип bool имеет значения только True или False. Был не прав. :'(

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #5, Отправлен: Январь 27, 2014, 21:40:25 »
Это ошибка в описании функции, возвращаемое значение имеет тип UINT. Что касается типа BOOL, то 0 всегда интерпритируется как FALSE, а любое значение отличное от 0 как TRUE. Но поскольку UINT и BOOL являются 4-байтными типами, то ошибки не возникает.


Думай, прежде чем говорить.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790

  • Автор темы
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #6, Отправлен: Январь 27, 2014, 21:48:31 »
Yashied  [?]
Цитировать
Это ошибка в описании функции
Ошибка на MSDN? Первый раз встречаю такое!  :o

PS
Забыл показать пример.
Код: AutoIt [Выделить]
Global $h_Gui, $a_Res, $h_Menu, $a_State[4] = [0x00000001, 0x00000002, 0x00000003, 0x00000000]

$h_Gui = GUICreate('Test', 200, 200)
GUISetState()
Sleep(1000)
$a_Res = DllCall('user32.dll', 'hwnd', 'GetSystemMenu', 'hwnd', $h_Gui, 'int', 0)
If (@error) Or (Not $a_Res[0]) Then Exit 13
$h_Menu = $a_Res[0]
For $i = 0 To 3
;~  $SC_CLOSE = 0xF060
;~  $MF_GRAYED = 0x00000001
;~  $MF_DISABLED = 0x00000002
;~  0x00000003 = BitOR($MF_DISABLED, $MF_GRAYED)
    $a_Res = DllCall('user32.dll', 'bool', 'EnableMenuItem', 'handle', $h_Menu, 'uint', 0xF060, 'uint', $a_State[$i])
    If (@error) Or ($a_Res[0] = -1) Then Exit $i + 23
    ConsoleWrite('previous state ($a_Res[0]): ' & $a_Res[0] & @LF)
    Sleep(1000)
Next
Do
Until GUIGetMsg() = -3;$GUI_EVENT_CLOSE

« Последнее редактирование: Январь 27, 2014, 22:23:06 от madmasles »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #7, Отправлен: Январь 28, 2014, 02:29:41 »
Ошибка на MSDN? Первый раз встречаю такое!  :o

Там полно ошибок.

Русское сообщество AutoIt

Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #7 Отправлен: Январь 28, 2014, 02:29:41 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790

  • Автор темы
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #8, Отправлен: Январь 28, 2014, 09:15:12 »
Yashied  [?]
Цитировать
Там полно ошибок.
Печально...


Добавлено: Январь 28, 2014, 11:40:58
Yashied  [?]
Цитировать
Это ошибка в описании функции, возвращаемое значение имеет тип UINT.
Если использовать тип UINT, то, при попытке изменить состояние заведомо не существующего пункта, возвращает 4294967295, а не -1. Если использовать int или bool, то возвращает -1.
« Последнее редактирование: Январь 28, 2014, 11:40:58 от madmasles, Причина: Объединение сообщений »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2712
  • Репутация: 1137
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #9, Отправлен: Январь 28, 2014, 15:57:34 »
madmasles  [?]
Цитировать
Если использовать тип UINT, то, при попытке изменить состояние заведомо не существующего пункта, возвращает 4294967295, а не -1
Знак минус находится в старшем байте, естественно при рассмотрении числа как беззнаковое этот старший байт превращает маленькое число в огромное, почти предел диапазона, типа было 0000001, стало 1000001.

BOOL - 32 битное целое. Естественно он возвратить какое либо число, в памяти то они все в цифрах.

Я просто проверил что у Notepad деактивировался пункт, а результат был False, значит не что-то не то. При удаче должен быть True.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790

  • Автор темы
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #10, Отправлен: Январь 28, 2014, 16:05:14 »
AZJIO  [?]
Цитировать
Я просто проверил что у Notepad деактивировался пункт, а результат был False, значит не что-то не то. При удаче должен быть True.
Так как пункт меню был активным, то функция EnableMenuItem вернула 0 - предыдущее состояние пункта. В этом и есть ошибка (см. 1-ое сообщение).

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #11, Отправлен: Январь 29, 2014, 12:18:26 »
Если использовать тип UINT, то, при попытке изменить состояние заведомо не существующего пункта, возвращает 4294967295, а не -1. Если использовать int или bool, то возвращает -1.

Это нормально. 4294967295 = FFFFFFFF = -1. Поскольку функция возвращает флаги состояния (тип UINT), то по логике тип должен быть беззнаковым. Такие ситуации встречаются сплош и рядом. Также очевидно, что функция DllCall() должна интерпритировать результат в соответствии с указанным типом, т.е. в данном случае возвращать TRUE (1) или FALSE (0). Но в случае с логическим типом этого не происходит.

P.S.

Имено по это причине я в WinAPIEx UDF использовал INT вместо BOOL и byte вместо BOOLEAN.

Русское сообщество AutoIt

Re: [Баг] Ошибка в функции _GUICtrlMenu_EnableMenuItem
« Ответ #11 Отправлен: Январь 29, 2014, 12:18:26 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
13 Ответов
6974 Просмотров
Последний ответ Декабрь 09, 2009, 23:56:19
от Kaster
3 Ответов
5701 Просмотров
Последний ответ Июль 06, 2013, 16:16:02
от Garrett
0 Ответов
3516 Просмотров
Последний ответ Декабрь 29, 2011, 14:54:56
от madmasles
18 Ответов
5980 Просмотров
Последний ответ Июнь 15, 2012, 09:35:20
от valdur2000
0 Ответов
1329 Просмотров
Последний ответ Июнь 13, 2012, 18:12:19
от madmasles
0 Ответов
2779 Просмотров
Последний ответ Октябрь 12, 2012, 11:50:25
от madmasles
2 Ответов
1753 Просмотров
Последний ответ Февраль 01, 2013, 14:40:10
от Rivald
3 Ответов
3875 Просмотров
Последний ответ Февраль 04, 2014, 20:47:08
от tech-gs
2 Ответов
2209 Просмотров
Последний ответ Май 13, 2013, 14:14:56
от Vlasssov
0 Ответов
1911 Просмотров
Последний ответ Июнь 02, 2014, 20:07:17
от madmasles