Orion9

|
Posted: Mon Feb 10, 2025 23:48 Post subject: |
|
|
Loopback wrote: | Ввиду большого объема внутренних изменений могут возникнуть неожиданные проблемы в любой функции, так что при необходимости будут выпущены хотфиксы. |
Проблемы действительно возникли, пришлось разбираться. Пока всё запустилось, но чтобы и другое всё проверить, потребуется больше времени.
DllCall - это, конечно, круто. Ещё бы уметь им пользоваться
Можете посмотреть, что не так в этом коде:
 Hidden text Code: | Func FileSecInfo(lParam)
Static SEE_MASK_INVOKEIDLIST = 0x0000000C, _
LPSHELLEXECUTEINFO = 60, _
SW_SHOWNORMAL = 1
SW_SHOW = 5
Local p = RequestCopyDataInfo("SP")
Local n = RequestCopyDataInfo("SN")
Local f = p & n
Local buff = Buffer(LPSHELLEXECUTEINFO) , verb = Buffer(10*2+2), file = Buffer(StrLen(f)*2+2), parm = Buffer(12*2+2)
verb.SetStr("properties" & Chr(0))
file.SetStr(f & Chr(0))
#parm.SetStr("Security" & Chr(0))
parm.SetStr("Безопасность" & Chr(0))
buff.SetNum(0, "dword", buff.size, _
"ulong", SEE_MASK_INVOKEIDLIST, _
"ptr", 0, _
"ptr", verb.Ptr, _
"ptr", file.Ptr, _
"ptr", parm.Ptr, _
"ptr", 0, _
"int", 1)
DllCall("shell32\ShellExecuteExW", "ptr", buff.Ptr)
Free(buff, verb, file, parm)
EndFunc
|
Вроде всё работает, но иногда спотыкается, а иногда и ТС валит.
Ну и с новыми функциями сам Гислер велел:
 Hidden text Code: | # внутренние ассоциации
Global AssocIniState = AssocState()
Func AssocState()
Local flt
IniRead /R flt %COMMANDER_INI% "Associations" "Filter1" ""
# секция включена
If flt <> "" Then
SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Clsw\2.ico"
Return true
Endif
# секция выключена
SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Clsw\6.ico"
Return false
EndFunc
Func SwitchAssocState(lParam)
Local ini = %COMMANDER_PATH% & "\Ini\Associations.ini"
Local script = %COMMANDER_PATH% & "\Scripts\Vbs\ChangeAssoc.vbs", sect, vbs = false
If AssocState() Then
# отключение секции
sect = '[-Associations]'
If vbs = false Then IniRenameSection(ini, "Associations", "-Associations")
Else
# включение секции
sect = '[+Associations]'
If vbs = false Then IniRenameSection(ini, "-Associations", "Associations")
Endif
If vbs = true Then ShellExec /SW_HIDE /WAIT:3000 "%script%" "%sect%"
AssocState()
If AssocIniState Then
AssocUpdateWin(true)
Else
RunThread AssocWinSynс
EndIf
EndFunc
Func AssocWinSynс()
Local b, i, h = 0
PostMessage(AUTORUN_TCHANDLE, 0x433, 519)
# ожидание окна
For i = 1 To 75
h = WinFind(0, "TDlgCustomColors")
If h > 0 Then Break
Sleep(20)
Next
If h > 0 Then
b = WinFind(h, (AUTORUN_TCARCH = 32 ? "TButton" : "Button"), (AUTORUN_TCARCH = 32 ? 3 : 2))
SendMessage(b, 0xF5, 0, 0)
Else
ShowHint("Окно не найдено")
Return
Endif
AssocUpdateWin(false)
EndFunc
Func AssocUpdateWin(lReload)
SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
If lReload Then SendCommand cm_ReloadFileIcons
SendCommand cm_ReloadBarIcons
Sleep(10)
SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
WinRedraw(1)
EndFunc
|
Совместимость с vbs-скриптом сохранена. |
|