Orion9

|
Posted: Sat Nov 29, 2025 00:41 Post subject: |
|
|
Loopback
После внесения последних изменений заметил косяк неприятный. Вот так в ТС х64 не работает:
 Hidden text | Code: | Global hDiskWnd, gDiskWndProc, gBindDiskWnd = true
Global gDriveList = List()
ControlSetMouseAction /R 15 DrivesMenu
ControlSetMouseAction /K:S /R 15 DrivesMenu
ControlSetMouseAction /K:C /R 15 DrivesMenu
If gBindDiskWnd Then
Global gDiskWP = Callback("DiskWndProc", "hwnd;uint;wparam;lparam")
hDiskWnd = WinFind(AUTORUN_TCHANDLE, _
AUTORUN_TCARCH = 32 ? "TMyPanel" : "Window", AUTORUN_TCARCH = 32 ? 6 : 10)
If hDiskWnd > 0 Then
gDiskWndProc = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
"hwnd", hDiskWnd, "int", -4, "long_ptr", gDiskWP.Ptr, "ptr")
EndIf
EndIf |
А вот так работает:
 Hidden text | Code: | Global hDiskWnd, gDiskWndProc, gBindDiskWnd = true
Global gDriveList = List()
#ControlSetMouseAction /R 15 DrivesMenu
#ControlSetMouseAction /K:S /R 15 DrivesMenu
ControlSetMouseAction /K:C /R 15 DrivesMenu
If gBindDiskWnd Then
Global gDiskWP = Callback("DiskWndProc", "hwnd;uint;wparam;lparam")
hDiskWnd = WinFind(AUTORUN_TCHANDLE, _
AUTORUN_TCARCH = 32 ? "TMyPanel" : "Window", AUTORUN_TCARCH = 32 ? 6 : 10)
If hDiskWnd > 0 Then
gDiskWndProc = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
"hwnd", hDiskWnd, "int", -4, "long_ptr", gDiskWP.Ptr, "ptr")
EndIf
EndIf |
Но не просто работает или не работает (если бы так), все, что идет за директивой Pragma Include %COMMANDER_PATH%\Ini\Scripts\Drives.aucfg в основном конфиге не загружается и не обрабатывается. Так я и заметил сначала - нажал на кнопку, а в ответ сообщение, что функция с кодом не зарегистрирована. Такое может прозойти только, если модуль не был подключен, а значит Autorun его не подключил. При выходе мелькает какое-то окно, возможно окно Autorun с ошибкой.
Вообше-то, я хотел повесить оконную функцию на контрол с классом Window:10 для удобства, чтобы не только на строке вкладок можно было вызыввать меню. Есть шанс исправить?
Ранее забыл написать. Если использовать ключ /D в расширенно меню, то ShowPopupMenu без /I:0 создает серый квадрат у неактивных пунктов, если у них нет значка. С этим можно что-то сделать?
А еще в такой записи | Code: | mnu = 'MENUITEM "' & cmd & '", em_aucmd -1 ClipPut %"gRegCmdName"' | ClipPut работает только с глобальной переменной, так и задумано? Кстати, и глобальную переменную с большим текстом такая запись, кажется, режет.
P.S.
Регулярные выражения безусловно добавили прыти. Недавно yozhik писал, что возникаект задача скачать и обработать несколько файлов с интернета, и теперь когда регулярные выражения есть, остается закачать файлы. Самый простой способ сделать всего один вызов к Urlmon.dll\URLDownloadToFileW. Метод имеет недостатки, но для небольших файлов вполне подходит. Простой пример на загрузке и парсинге rss-ленты
 Hidden text | Code: | RegisterCommand 60033 "RSSCheck"
Func RSSCheck()
Local hr, txt, rex, out, i
Local url = "https://totalcmd.net/rss.xml"
Local file = TEMP & "\rss.xml"
hr = DllCall("Urlmon.dll\URLDownloadToFileW", _
"ptr", 0, "wstr", url, "wstr", file, "dword", 0, "ptr", 0, "hresult")
If hr <> 0 Then
txt = "An error occured." & auCRLF & url & auCRLF & _
"Error code: " & hr & auCRLF & GetINetECode(hr)
Return MsgBox(txt, "Autorun", 16)
EndIf
txt = FileRead(file)
rex = RegExp('<item>\R<title>(.*?)</title>(?:.*?)<link>(.*?)</link>\R<pubDate>(.*?)</pubDate>(?:.*?)</item>', txt)
If rex.Exec() Then
Do
i += 1
out &= rex.Match[1] & auCRLF
out &= rex.Match[2] & auCRLF
out &= rex.Match[3] & auCRLF & auCRLF
Until not rex.ExecNext()
EndIf
Free(rex)
MsgBox(out, "RSS " & i, 64)
EndFunc
Func GetINetECode(nCode)
Local sCode
Switch nCode
Case 0x800C0002 # INET_E_INVALID_URL
sCode = "The URL could not be parsed."
Case 0x800C0003 # INET_E_NO_SESSION
sCode = "No Internet session was established."
Case 0x800C0004 # INET_E_CANNOT_CONNECT
sCode = "The attempt to connect to the Internet has failed."
Case 0x800C0005 # INET_E_RESOURCE_NOT_FOUND
sCode = "The Internet resource was not found."
Case 0x800C0007 # INET_E_DATA_NOT_AVAILABLE
sCode = "An Internet connection was established, but the data cannot be retrieved."
Case 0x800C0008 # INET_E_DOWNLOAD_FAILURE
sCode = "The download has failed (the connection was interrupted)."
Case 0x800C000B # INET_E_CONNECTION_TIMEOUT
sCode = "The Internet connection has timed out."
Case 0x800C000C # INET_E_INVALID_REQUEST
sCode = "The request was invalid."
Case 0x800C000D # INET_E_UNKNOWN_PROTOCOL
sCode = "The protocol is not known and no pluggable protocols have been entered that match."
Case 0x800C000E # INET_E_SECURITY_PROBLEM
sCode = "A security problem was encountered (certificate problems, client authentication, etc.)"
Case 0x800C0019 # INET_E_INVALID_CERTIFICATE
sCode = "The SSL certificate is invalid."
Else
sCode = "No error code description"
EndSwitch
Return sCode
EndFunc |
Функция при всей простоте имеет недостатки: не все адреса могут открыться, а также отсутствует гибкая обработка ошибок. К тому же, если файл довольно большой, будет заметное зависание.
Поэтому пришлось сделать еще одну функцию на основе Wininet.dll. В принципе, она уже готова, осталось только оформить все с примерами. Вероятно завтра доделаю. |
|