Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Autorun 
Author Message
Loopback



PostPosted: Wed Feb 19, 2025 22:25    Post subject: Reply with quote

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:
Только регулярками там скорее всего не обойтись, всё-равно придётся код построчно просматривать

Конечно же не имелось в виду, что всё подряд заменять, пройтись внимательно с поиском и заменой.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group