Loopback
|
Posted: Wed Feb 19, 2025 22:25 Post subject: |
|
|
Orion9
Сначала написал что всё в порядке, но как обычно забыл проверить на x64. На ней функция не работает по причине неправильных смещений. К сожалению, в структурах есть такая неприятная вещь, как выравнивание полей, из-за чего не всегда смещение следующего поля будет равно смещению текущего + его размер.
В связи с чем инициализация под x64 должна выглядеть по-другому:
Code: |
Func NotifyIconAdd(ID, CallbackMessage, hIcon, Tip)
Local NIF_MESSAGE = 0x00000001, _
NIF_ICON = 0x00000002, _
NIF_TIP = 0x00000004, _
TIP_MAXCHAR = 128 - 1
Local buf = Buffer((auPtrSize = 4 ? 956 : 976))
buf.Zero()
If auX64 Then
buf.SetNum(0, "dword", buf.size)
buf.SetNum(8, "hwnd", AUTORUN_TCHANDLE)
buf.SetNum(16, "uint", ID, _
"uint", BitOR(NIF_MESSAGE, NIF_ICON, NIF_TIP), _
"uint", CallbackMessage)
buf.SetNum(32, "ptr", hIcon)
Else
buf.SetNum(0, "dword", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"uint", ID, _
"uint", BitOR(NIF_MESSAGE, NIF_ICON, NIF_TIP), _
"uint", CallbackMessage, _
"ptr", hIcon)
EndIf
buf.SetStr(StrLeft(Tip, TIP_MAXCHAR) & Chr(0), (auX64 ? 40 : 24)) # auPtrSize*2 + 4*4
Return DllCall("Shell32.dll\Shell_NotifyIconW", "uint", 0, "ptr", buf.ptr, "bool")
EndFunc
|
Еще, для передачи имени файла буфер не нужен, всё необходимое есть в DllCall:
Code: |
Func TrayIcon()
Local i = 0, _
f = %COMMANDER_PATH% & "\TOTALCMD.EXE", _
file, hint, _
hIco = 0
#i = 15
#f = GetKnownFolderPath("System") & "\shell32.dll"
hIco = DllCall("shell32\ExtractIconW", "ptr", AUTORUN_TCHANDLE, "wstr", f, "uint", i, "ptr")
hint = "Autorun " & FileGetVersion(AUTORUN_PATH & "\Autorun.wdx", "FileVersion")
NotifyIconAdd(1001, 55555, hIco, hint)
If hIco > 0 Then DllCall("DestroyIcon", "ptr", hIco, "bool")
EndFunc
|
Да, и еще надо иконку скрывать перед выходом ТС, иначе в трее остаётся болтаться. Ну и buf в функции надо освобождать (или в static его).
Orion9 wrote: | Только регулярками там скорее всего не обойтись, всё-равно придётся код построчно просматривать |
Конечно же не имелось в виду, что всё подряд заменять, пройтись внимательно с поиском и заменой. |
|