AkulaBig писал(а):Да.
Это хорошо. Поздравляю
AkulaBig писал(а):Это для детекта только русских кодировок или для любой?
Заявлено много кодировок. У них есть
собственный набор файлов для тестов, но даже с ним можно наблюдать некоторые проблемы у нескольких файлов. Ещё самый простой способ - зайти в каталог LANGUAGE самого Тотала
Чуть дополнил код проверками, которые, как известно, лишними никогда не бывают:
[cut]
Код: Выделить всё
Pragma AutorunPluginFields "CharSet:::CharDetect"
Func CharDetect(FileName, FieldIndex, UnitIndex)
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
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')
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")
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
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
DllCall(sLib & '\uchardet_data_end', 'ptr', hUC, 'cdecl')
#DllCall('uchardet\uchardet_delete', 'ptr', hUC, 'cdecl')
Res = DllCall(sLib & '\uchardet_get_charset', 'ptr', hUC, 'str:cdecl')
# Ctrl - отобразить количество прочитанных байт
Res = (IsPressed (0x11) ? "read: " & bytes : "") & ' ' & Res
Return Res
EndFunc
[/cut]
Теперь, например, на симлинках показывает ошибку ReadFile ) Но вот заметил, что в ТС х64 наполнение кастомной колонки как-то не так происходит, как в 32-битном Тотале. Такое ощущение, что он сразу всю страницу пытается считать перед отображением. В 32-битном ТС работает глаже и приятнее.