Автор Тема: [Баг] Крах скрипта при использований DllCallbackFree из callback функции  (Прочитано 8760 раз)

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8070
  • Репутация: 2311
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Пример:

Код: AutoIt [Выделить]
  1. $hTimer = __TCPInet_SetTimer('test')
  2.  
  3. Sleep(1000)
  4.  
  5. Func test($hWnd, $iMsg, $iIDTimer, $dwTime)
  6.     ConsoleWrite($iIDTimer & @LF)
  7.     __TCPInet_KillTimer($hTimer, $iIDTimer)
  8.  
  9. Func __TCPInet_SetTimer($sTimerFunc, $iElapse = 250)
  10.     Local $hCallBack = 0, $pTimerFunc = 0, $aResult
  11.    
  12.     $hCallBack = DllCallbackRegister($sTimerFunc, 'none', 'hwnd;int;uint_ptr;dword')
  13.     $pTimerFunc = DllCallbackGetPtr($hCallBack)
  14.    
  15.     If $hCallBack = 0 Or $pTimerFunc = 0 Then
  16.         Return SetError(-1, -1, 0)
  17.     EndIf
  18.    
  19.     $aResult = DllCall('user32.dll', 'uint_ptr', 'SetTimer', 'hwnd', 0, 'uint_ptr', 1001, 'uint', $iElapse, 'ptr', $pTimerFunc)
  20.    
  21.     If @error Or $aResult[0] = 0 Then
  22.         DllCallbackFree($hCallBack)
  23.         Return SetError(@error, @extended, 0)
  24.     EndIf
  25.    
  26.     Return $hCallBack
  27.  
  28. Func __TCPInet_KillTimer($hTimer, $iIDTimer)
  29.     DllCall('user32.dll', 'bool', 'KillTimer', 'hwnd', 0, 'uint_ptr', $iIDTimer)
  30.     DllCallbackFree($hTimer) ;Причина падения


Скрипт валится если использовать __TCPInet_KillTimer из функции вызова (test()).
Проверено на версий 3.3.10.2.

Я понимаю что не совсем правильно закрывать callback из него самого же, но всё таки, я думаю скрипт не должен падать...

С AdlibRegister такого не происходит:

Код: AutoIt [Выделить]
AdlibRegister('test')

Sleep(1000)

Func test()
    Local Static $iCall = 0
   
    $iCall += 1
   
    ConsoleWrite('Call #' & $iCall & @LF)
    AdlibUnRegister('test')
EndFunc

« Последнее редактирование: Январь 07, 2015, 00:57:35 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

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


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR,
v3.3.8.1 и v3.3.13.19 у меня Ваш код нормально отрабатывает (WinXP 32).

Помечен как лучший ответ пользователем CreatoR Отправлен Январь 07, 2015, 05:25:05

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Я понимаю что не совсем правильно закрывать callback из него самого же, но всё таки, я думаю скрипт не должен падать...

Тоесть уничтожать объект, когда он еще используется, это "не совсем правильно"? К слову, у меня тоже не вылетает скрипт, но тем не менее так делать категорически нельзя. А кроме того, зачем тебе освобождать callback, если его код постоянный? Достаточно один раз при старте скрипта вызвать DllCallbackRegister() и забыть про него. Его даже при выходе можно не освобождать, главное, чтобы отвязать его от всех функций. В данном случае достаточно вызвать KillTimer().

Код: AutoIt [Выделить]
If $hCallBack = 0 Or $pTimerFunc = 0 Then
    Return SetError(-1, -1, 0)
EndIf


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

Код: AutoIt [Выделить]

Как же меня раздражает jpm, пишет то, что сам не понимает. Вот этими тупыми выражениями, он исказил весь смысл WinAPIEx UDF. Именно поэтому я и использую до сих пор 3.3.8.1.
« Последнее редактирование: Январь 07, 2015, 01:51:50 от Yashied »


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

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


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8070

  • Автор темы
  • Репутация: 2311
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Стоит ли создать тикет по теме?

Оффлайн firex [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 943
  • Репутация: 203
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR
А есть смысл?

Уничтожите объект > вызываться он не будет(должен), иначе - крах > раз он не вызывается, то какой смысл в "уничтожении"?

P.S. У меня отрабатывает без вылета.

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


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8070

  • Автор темы
  • Репутация: 2311
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Я считаю что так быть не должно, скрипт не должен крашится ни при каких обстоятельствах.

Кстати, крашится он из за x64, добавляем в начало:
Код: AutoIt [Выделить]
#AutoIt3Wrapper_UseX64=n

и скрипт не крашится :).

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Я считаю что так быть не должно, скрипт не должен крашится ни при каких обстоятельствах.

Крах скрипта в данном случае вполне логичен, а вот то, что в некоторых случаях пример отрабатывает нормально, это можно отнести к издержкам AutoIt. После того, как ты вызвал DllCallbackFree(), соответствующей функции считай не существует. Это тоже самое, что попытаться выгрузить DLL из самого себя.

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


 

Похожие темы

  Тема / Автор Ответов Последний ответ
21 Ответов
12778 Просмотров
Последний ответ Апрель 05, 2010, 20:16:51
от CreatoR
5 Ответов
4768 Просмотров
Последний ответ Январь 21, 2011, 19:22:39
от CreatoR
7 Ответов
3925 Просмотров
Последний ответ Февраль 24, 2011, 22:05:08
от `p r o x y
13 Ответов
7119 Просмотров
Последний ответ Февраль 02, 2012, 18:56:42
от winstan
7 Ответов
4393 Просмотров
Последний ответ Март 20, 2012, 11:05:30
от erlik
2 Ответов
2166 Просмотров
Последний ответ Декабрь 15, 2012, 00:53:50
от Kornerupin
2 Ответов
2775 Просмотров
Последний ответ Март 15, 2013, 07:20:37
от Trans
2 Ответов
2192 Просмотров
Последний ответ Сентябрь 19, 2013, 15:59:20
от CreatoR
5 Ответов
2749 Просмотров
Последний ответ Октябрь 07, 2013, 11:54:26
от madmasles
8 Ответов
6895 Просмотров
Последний ответ Октябрь 27, 2014, 09:45:03
от joiner