Orion9

|
Posted: Mon Apr 28, 2025 12:09 Post subject: |
|
|
AkulaBig wrote: | Это из серии лучше сразу соломки подстелить? |
Можно и так сказать. Считайте, что это был первый баг-репорт.) И конечно же, имхо, лучше подстелить соломку.
AkulaBig wrote: | Вот-бы названия пользовательских колонок брать из Autorun. |
Одно из немногих, чем я не пользовался в Autorun, функция "SetFieldsParam". Посмотрите. Может она вам пригодится. Хотя не до конца понял, что именно вам требуется сделать.
AkulaBig wrote: | Не работает и в вашей сборке. |
Кажется, в сборке дополнительного поля "autorun.CharSet" не было ни в секции CustomFields, ни в HintsCustomField, хотя сама функция "CharDetect" есть в модуле Plugin.aucfg, и в рабочем ТС я ей регулярно пользуюсь, главным образом, в хинте к текстовым файлам. Но сейчас проверил: на Win11 и ТС 11.51 проблемы не обнаружил. Это плохо. Без повторения проблемы, как вы понимаете, исправить будет сложно.
Можно попробовать поставить несколько OutputDebugString и посмотреть на каком шаге зависает в окне отладчика:
 Hidden text Code: | Func CharDetect(FileName, FieldIndex, UnitIndex)
OutputDebugString("CharDetect: Step=1 FileName=" & FileName)
Static GENERIC_READ = 0x80000000, _
OPEN_EXISTING = 3, _
FILE_SHARE_READ = 1, _
FILE_ATTRIBUTE_NORMAL = 128
Static buf = Buffer(10240)
Static sLib = "uchardet" & (auX64 ? "" : "_x86") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs\" & sLib, "ptr")
If StrPos(FileGetAttr(FileName), "D") Then Return "<Dir>"
If hLib = 0 Then Return "Error LoadLibrary " & sLib
OutputDebugString("CharDetect: Step=2")
Static hUC = DllCall(sLib & '\uchardet_new', 'ptr:cdecl')
If hUC = 0 Then
Return "uchardet_new returned 0"
Endif
DllCall(sLib & '\uchardet_reset', 'ptr', hUC, 'cdecl')
OutputDebugString("CharDetect: Step=3")
Local bytes = 0
Local fs = FileGetSize(FileName)
buf.Zero()
If fs > buf.Size Then fs = buf.Size
Local hFile = DllCall("CreateFileW", "wstr", FileName, _
"dword", GENERIC_READ, _
"dword", FILE_SHARE_READ, _
"ptr", 0, _
"dword", OPEN_EXISTING, _
"dword", FILE_ATTRIBUTE_NORMAL, _
"ptr", 0, _
"handle")
OutputDebugString("CharDetect: Step=4")
If hFile > 0 Then
Local bRead = DllCall("ReadFile", "handle", hFile, _
"ptr", buf.ptr, _
"dword", fs, _
"dword*", @bytes, _
"ptr", 0, _
"bool")
DllCall("CloseHandle", "handle", hFile)
If Not bRead Then Return "ReadFile failed"
If bytes = 0 Then Return "ReadFile fetched 0 bytes"
Else
Return "CreateFileW failed"
Endif
OutputDebugString("CharDetect: Step=5")
Local Res = DllCall(sLib & '\uchardet_handle_data', 'ptr', hUC, 'ptr', buf.ptr, 'uint', bytes, 'int:cdecl')
If Res > 0 Then
Return "uchardet_handle_data returned " & Res
Endif
OutputDebugString("CharDetect: Step=6")
DllCall(sLib & '\uchardet_data_end', 'ptr', hUC, 'cdecl')
#DllCall('uchardet\uchardet_delete', 'ptr', hUC, 'cdecl')
OutputDebugString("CharDetect: Step=7")
Res = DllCall(sLib & '\uchardet_get_charset', 'ptr', hUC, 'str:cdecl')
# Ctrl - отобразить количество прочитанных байт
Res = (IsPressed (0x11) ? "read: " & bytes : "") & ' ' & Res
OutputDebugString("CharDetect: Step=8")
Return Res
EndFunc |
На выходе должно быть что-то вроде:
Code: | [9624] CharDetect: Step=1 FileName=C:\Portable\TC 11.50\LANGUAGE\WCMD_RUS.LNG
[9624] CharDetect: Step=2
[9624] CharDetect: Step=3
[9624] CharDetect: Step=4
[9624] CharDetect: Step=5
[9624] CharDetect: Step=6
[9624] CharDetect: Step=7
[9624] CharDetect: Step=8
[9624] CharDetect: Step=1 FileName=C:\Portable\TC 11.50\LANGUAGE\WCMD_RUS.MNU
[9624] CharDetect: Step=2
[9624] CharDetect: Step=3
[9624] CharDetect: Step=4
[9624] CharDetect: Step=5
[9624] CharDetect: Step=6
[9624] CharDetect: Step=7
[9624] CharDetect: Step=8 |
Если зависнет, будет интересно посмотреть на каком шаге.
AkulaBig wrote: | Через exe (EncDetect) работает, но очень-очень медленно. |
Да это вообще не вариант. Я его оставил только, чтобы позже использовать как готовую наработку, если вдруг понадобится вывести что-нибудь из консольной утилиты в поля Autorun. Есть подозрение, что виснет на DllCall файловых функций Windows. По идее, надо переделать CharDetect, задействовав новую функцию плагина "FileRead".
P.S. По поводу ограничений, кажется, вспомнил: 60 - ограничение на количество строк в подсказке, кастомных полей может быть больше. |
|