Orion9

|
Posted: Tue Oct 28, 2025 20:31 Post subject: |
|
|
| Loopback wrote: | | Новый вариант не пробовал, но предыдущий валит тотал x64 при выходе. |
Похоже, что так. В Win11 это происходит "тихо", даже не сразу заметил. Ну и ладно. Я все-равно этой версией редко пользуюсь, в том числе из-за разных проблем с Autorun.
| Loopback wrote: | | Ставится-то он без проблем, но уже не снимается и тотал крашится. |
C окном ТС вероятно так и есть, однако в моем случае если добавить к секции финализации, то краш уходит даже на Win8:
| Code: | Pragma AutorunFinalizeSection
If gHBarWndProc > 0 Then
DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
"hwnd", hBarWnd, "int", -4, "long_ptr", gHBarWndProc, "ptr")
EndIf |
| Loopback wrote: | | Я делал тесты, меняя ID кнопки Отмена с IDCANCEL (2) на другой. В этом случае диалог появлялся всегда. |
Интересный ход. Возможно из этого получится что-то выжать и обойти проблему, но всё-таки хотелось докапаться до причины, почему это вообще происходит. Сдается мне, что все это может быть связано - вылеты потоков, окон диалога, глючная загрузка bitmap и т.д. Сделал на скорую руку кнопку для теста потока на основе вашей первоначальной функции перебора торрента:
 Hidden text | Code: | RegisterCommand 70508 "TorrentBugTest"
Func TorrentBugTest(lParam)
RunThread("TorrentThreadTest")
EndFunc
Func TorrentThreadTest()
Local hIco = 0
Local hWnd = DllCall("CreateWindowExW", _
"dword", 0, _
"wstr", "msctls_progress32", _
"wstr", "", _
"dword", 0x00C80000, _
"int", 200, "int", 100, "int", Scale(400), "int", Scale(50), _
"handle", AUTORUN_TCHANDLE, _
"handle", 0, "handle", 0, "ptr", 0, "handle")
If hWnd = 0 Then Return 0
WinAlign(hWnd, 0, DllCall("GetDesktopWindow"))
WinSetPos("", -Scale(50), "", "", 1, hWnd)
WinSetState(5, hWnd)
Static PBS_MARQUEE = 0x08, _
PBM_SETMARQUEE = 1034, _
WM_GETICON = 0x7f, _
WM_SETICON = 0x80
hIco = SendMessage(AUTORUN_TCHANDLE, WM_GETICON, 2, 0)
SendMessage(hWnd, WM_SETICON, 0, hIco)
WinSetStyle(PBS_MARQUEE, 2, hWnd)
SendMessage(hWnd, PBM_SETMARQUEE, 1, 0)
For i = 1 To 20
TorrentInfo(hWnd, i, "d:\Temp\Jinn'sLiveUSB 11.2.2.torrent")
If WinGetState(1, hWnd) = 0 Then
MsgBox("Тестирование прервано", "Autorun", 48)
Return
EndIf
Next
MsgBox("Тестирование успешно завершено", "Autorun", 64)
DllCall("DestroyWindow", "handle", hWnd)
EndFunc
Func TorrentInfo(hWnd, nPass, sFile)
Static aFixed = List('Name', 'TotalSize', 'FileCount', 'BlockSize', 'BlockCount', _
'Created', 'Creator', 'Hash', 'Comment', 'Encoding', _
'Multifile', 'PrivateTorrent', 'Publisher', 'PublisherURL')
Static aMulti = List('Tracker', 'Webseed', 'Error', 'CustomField')
Static sLibName = "TCTorrent.wlx" & (auX64 ? "64" : "")
Static sLibPath = COMMANDER_PATH & "\Plugins\wlx\TCTorrent\" & sLibName
Local hDll = DllCall("LoadLibrary", "wstr", sLibPath, "handle")
If hDll = 0 Then Return
Local hHandle = DllCall(sLibName & "\TorrentOpen", "wstr", sFile, "handle")
If hHandle = 0 Then
DllCall("FreeLibrary", "handle", hDll)
Return
EndIf
Local nCount, sRes
For i = 0 to aFixed.Count - 1
sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aFixed[i], "int", 0, "wstr")
OutputDebugString(aFixed[i] & ": " & sRes)
WinSetText(nPass & ": " & sRes, hWnd)
Next
OutputDebugString(auCRLF & 'Files:')
nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", "File", "uint")
For j = 0 To nCount - 1
sRes = StrFormat("[%12s] %s", _
DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "FileSize", "int", j, "wstr"), _
DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", "File", "int", j, "wstr"))
OutputDebugString(sRes)
WinSetText(nPass & ": " & sRes, hWnd)
Next
For i = 0 to aMulti.Count - 1
OutputDebugString(auCRLF & aMulti[i] & 's:')
nCount = DllCall(sLibName & "\TorrentCountGet", "handle", hHandle, "wstr", aMulti[i], "uint")
For j = 0 To nCount - 1
sRes = DllCall(sLibName & "\TorrentGet", "handle", hHandle, "wstr", aMulti[i], "int", j, "wstr")
OutputDebugString(sRes)
WinSetText(nPass & ": " & sRes, hWnd)
Next
Next
DllCall(sLibName & "\TorrentClose", "handle", hHandle)
DllCall("FreeLibrary", "handle", hDll)
EndFunc |
Почему-то был уверен, что баг проявится быстро, однако не всё так просто. У меня используется Jinn'sLiveUSB 11.2.2 на 9800 файлов, но можно прописать любой большой торрент и увеличить количество циклов в For..Next.
В общем, не сразу, но через какое-то время потоки, которые также запущены в фоне (заголовок, подсчет времени воспроизведения, пинг трех адресов и т.д.) начинают отваливаться. Удивительно, но сам поток TorrentThreadTest мне так и не удалось завалить. Видимо он слишком простенький для этого, не использует какие-то критические части Autorun. Но проблема определенно есть.
| Loopback wrote: | | Нет API для передачи этих данных из плагина. Это дело не пяти минут. |
Жалко, конечно, но что поделать. Как-нибудь пока проживем без этого ) |
|