Orion9

|
Posted: Wed Apr 23, 2025 13:35 Post subject: |
|
|
AkulaBig
В дебри старого кода лезть не хочется, да и нет такой возможности. Наверное, лучше сделать отдельную кнопку и попробовать на ней для начала, как всё будет работать:
Code: | TOTALCMD#BAR#DATA
60020
%COMMANDER_EXE%
MediaInfoTest
1
-1
|
Code: | RegisterCommand 60020 "MediaInfoTest"
Func MediaInfoTest(lParam)
Local file = RequestCopyDataInfo("SP") & RequestCopyDataInfo("SN")
If Not FileExist(file) Then
ShowHint("Файл не существует " & file)
Return
Endif
If StrPos(FileGetAttr(file), "D") Then
ShowHint("Каталог" & file)
Return
Endif
Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs\" & sLib, "ptr")
If hLib = 0 Then
ShowHint("Error LoadLibrary " & sLib)
Return
EndIf
Local hMI = DllCall(sLib & '\MediaInfo_New', "Ptr")
If hMI = 0 Then
ShowHint("MediaInfo_New returned 0")
Return
Endif
If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", file, "uint") <> 1 Then
DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
Return ShowHint("MediaInfo_Open failed to open file " & file)
EndIf
If IsPressed(0x11) Then
DllCall(sLib & '\MediaInfo_Option', 'ptr', hMI, "wstr", "Complete", "wstr", "1", "wstr")
EndIf
Local sMI = DllCall(sLib & '\MediaInfo_Inform', 'ptr', hMI, "uint", 0, "wstr")
DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
ShowHint(sMI)
EndFunc |
Наспех сделанный и плохо протестированный код, но, кажется, он работает. Вызов с CTRL показывает все данные MediaInfo файла под курсором.
Фича с подсказкой при наведении на файлы мне очень нравится, регулярно ей пользуюсь. Но, насколько я понимаю, вы юзаете x64, а там с этим есть определенные проблемы. И всё же, если будете делать, то лучше, наверное, делать вызов функций по адресам, как это сделано в ahk-скрипте:
Code: | ;get dll handle
this.dll := DllCall("LoadLibrary", "Str", dll_location, "Ptr")
;get pointers to make functions cleaner
this.MediaInfo_New := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_New", "Ptr")
this.MediaInfo_Open := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Open", "Ptr")
this.MediaInfo_Inform := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Inform", "Ptr")
this.MediaInfo_Option := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Option", "Ptr")
this.MediaInfo_Close := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Close", "Ptr")
this.MediaInfo_Delete := DllCall("GetProcAddress", "Ptr", this.dll, "AStr", "MediaInfo_Delete", "Ptr")
;use this.handle during subsequent dll calls
this.handle := DllCall(this.MediaInfo_New, "Ptr")
;set some defaults
this.Option("Inform","TXT") |
А саму библиотеку загружать только один раз при старте ТС или при первом вызове функции BigHint. |
|