ViSiToR , Спасибо
Просьба посмотреть на Тестовом скрипте (правда и скорость обработки осталась такая же)
При попытке внести в ImageList иконку файла с расширениями :
$ext='exe' or $ext='htm' or $ext='html' or $ext='wjr' or $ext='js' и возможно еще какими -то
выдается системное Error : _GUIImageList_AddIcon : -1
и скрипт выгружается ?
Такое впечатление, что система ругается на то,что разным файлам присвоена одна иконка
или наоборот одинаковым файлам -разные ?
Код: #include <File.au3>
#include <Array.au3>
#include <GuiImageList.au3>
$gui= GuiCreate("Test",600, 500)
$hListView = _GUICtrlListView_Create ($gui, "",15,10,480,472,BitOR($LVS_REPORT,$LVS_SHOWSELALWAYS))
;Назначение иконок
$hImage = _GUIImageList_Create (16,16,5); 5-ФОН ОКНА
_GUIImageList_AddIcon ($hImage, "shell32.dll", 0)
_GUICtrlListView_SetImageList ($hListView, $hImage, 1)
; Создание колонок в ListView
_GUICtrlListView_InsertColumn ($hListView, 0, "Имя", 220)
_GUICtrlListView_InsertColumn ($hListView, 1, "Тип", 70)
$folder=@ProgramFilesDir&'\'&'Download Master'
;$folder=@ProgramFilesDir&'\'&'AutoIt3\Include'
$FileList=_FileListToArray($folder,"*",0)
$indImageList=0
For $i=1 To UBound($FileList)-1
$indImageList = $indImageList+1
_GUICtrlListView_AddItem ($hListView, $FileList[$i])
$arIcon=_FileGetIcon($folder&'\'&$FileList[$i])
MsgBox(0,'$FileList[$i] = '&$FileList[$i],$arIcon[1]&@CRLF& $arIcon[2])
_GUIImageList_AddIcon ($hImage, $arIcon[1], $arIcon[2])
_GUICtrlListView_SetItemImage ($hListView,$i-1, $indImageList)
Next
GUISetState ()
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd
Func _FileGetIcon($sFile)
Local $sRegDefault = "", $sDefIcon = "", $sExt, $hSearch, $sIconFile, $nIcon=0
Local $aRet[3], $iError = 0
If _IsFolder($sFile) Then
$sRegDefault = RegRead("HKCR\Folder", "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
Else
$sExt = StringRegExpReplace($sFile, '^.*\.', '.')
If $sExt = ".lnk" Then
Local $aLinkInfo = FileGetShortcut($sFile)
If Not @error Then
Dim $aRet[3] = [2, _Expand_Environments($aLinkInfo[4]), $aLinkInfo[5]]
Return $aRet
EndIf
EndIf
If $sExt = $sFile Then
$hSearch = FileFindFirstFile($sFile & ".*")
$sExt = StringRegExpReplace(FileFindNextFile($hSearch), '^.*\.', '.')
$sFile &= $sExt
FileClose($hSearch)
EndIf
$sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")
If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
EndIf
If $sDefIcon = "" Then
$sIconFile = "shell32.dll"
ElseIf $sDefIcon <> "%1" Then
If StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
$sIconFile = $sFile
$nIcon = 0
Else
Local $aDefIconSplit = StringSplit($sDefIcon, ",")
If IsArray($aDefIconSplit) Then
$sIconFile = $aDefIconSplit[1]
If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
Else
$iError = 1
EndIf
EndIf
ElseIf $sDefIcon = "%1" Then
$sIconFile = $sFile
$nIcon = 0
EndIf
Dim $aRet[3] = [2, _Expand_Environments($sIconFile), $nIcon]
Return SetError($iError, 0, $aRet)
EndFunc
Func _Expand_Environments($sString)
$sString = StringReplace($sString, "%windir%", @WindowsDir)
$sString = StringRegExpReplace($sString, "%HomeDrive%|%SystemDrive%", @HomeDrive)
$sString = StringReplace($sString, "%HomePath%", @HomePath)
$sString = StringReplace($sString, "%Temp%", @TempDir)
$sString = StringReplace($sString, "%ProgramFiles%", @ProgramFilesDir)
$sString = StringReplace($sString, "%UserProfile%", @UserProfileDir)
$sString = StringReplace($sString, "%AppData%", @AppDataDir)
$sString = StringReplace($sString, "%ComSpec%", @ComSpec)
Return $sString
EndFunc
Func _IsFolder($name)
Return StringInStr(FileGetAttrib($name), "D")
EndFunc
Просьба посмотреть на Тестовом скрипте (правда и скорость обработки осталась такая же)
При попытке внести в ImageList иконку файла с расширениями :
$ext='exe' or $ext='htm' or $ext='html' or $ext='wjr' or $ext='js' и возможно еще какими -то
выдается системное Error : _GUIImageList_AddIcon : -1
и скрипт выгружается ?
Такое впечатление, что система ругается на то,что разным файлам присвоена одна иконка
или наоборот одинаковым файлам -разные ?
Код: #include <File.au3>
#include <Array.au3>
#include <GuiImageList.au3>
$gui= GuiCreate("Test",600, 500)
$hListView = _GUICtrlListView_Create ($gui, "",15,10,480,472,BitOR($LVS_REPORT,$LVS_SHOWSELALWAYS))
;Назначение иконок
$hImage = _GUIImageList_Create (16,16,5); 5-ФОН ОКНА
_GUIImageList_AddIcon ($hImage, "shell32.dll", 0)
_GUICtrlListView_SetImageList ($hListView, $hImage, 1)
; Создание колонок в ListView
_GUICtrlListView_InsertColumn ($hListView, 0, "Имя", 220)
_GUICtrlListView_InsertColumn ($hListView, 1, "Тип", 70)
$folder=@ProgramFilesDir&'\'&'Download Master'
;$folder=@ProgramFilesDir&'\'&'AutoIt3\Include'
$FileList=_FileListToArray($folder,"*",0)
$indImageList=0
For $i=1 To UBound($FileList)-1
$indImageList = $indImageList+1
_GUICtrlListView_AddItem ($hListView, $FileList[$i])
$arIcon=_FileGetIcon($folder&'\'&$FileList[$i])
MsgBox(0,'$FileList[$i] = '&$FileList[$i],$arIcon[1]&@CRLF& $arIcon[2])
_GUIImageList_AddIcon ($hImage, $arIcon[1], $arIcon[2])
_GUICtrlListView_SetItemImage ($hListView,$i-1, $indImageList)
Next
GUISetState ()
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd
Func _FileGetIcon($sFile)
Local $sRegDefault = "", $sDefIcon = "", $sExt, $hSearch, $sIconFile, $nIcon=0
Local $aRet[3], $iError = 0
If _IsFolder($sFile) Then
$sRegDefault = RegRead("HKCR\Folder", "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
Else
$sExt = StringRegExpReplace($sFile, '^.*\.', '.')
If $sExt = ".lnk" Then
Local $aLinkInfo = FileGetShortcut($sFile)
If Not @error Then
Dim $aRet[3] = [2, _Expand_Environments($aLinkInfo[4]), $aLinkInfo[5]]
Return $aRet
EndIf
EndIf
If $sExt = $sFile Then
$hSearch = FileFindFirstFile($sFile & ".*")
$sExt = StringRegExpReplace(FileFindNextFile($hSearch), '^.*\.', '.')
$sFile &= $sExt
FileClose($hSearch)
EndIf
$sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")
If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
EndIf
If $sDefIcon = "" Then
$sIconFile = "shell32.dll"
ElseIf $sDefIcon <> "%1" Then
If StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
$sIconFile = $sFile
$nIcon = 0
Else
Local $aDefIconSplit = StringSplit($sDefIcon, ",")
If IsArray($aDefIconSplit) Then
$sIconFile = $aDefIconSplit[1]
If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
Else
$iError = 1
EndIf
EndIf
ElseIf $sDefIcon = "%1" Then
$sIconFile = $sFile
$nIcon = 0
EndIf
Dim $aRet[3] = [2, _Expand_Environments($sIconFile), $nIcon]
Return SetError($iError, 0, $aRet)
EndFunc
Func _Expand_Environments($sString)
$sString = StringReplace($sString, "%windir%", @WindowsDir)
$sString = StringRegExpReplace($sString, "%HomeDrive%|%SystemDrive%", @HomeDrive)
$sString = StringReplace($sString, "%HomePath%", @HomePath)
$sString = StringReplace($sString, "%Temp%", @TempDir)
$sString = StringReplace($sString, "%ProgramFiles%", @ProgramFilesDir)
$sString = StringReplace($sString, "%UserProfile%", @UserProfileDir)
$sString = StringReplace($sString, "%AppData%", @AppDataDir)
$sString = StringReplace($sString, "%ComSpec%", @ComSpec)
Return $sString
EndFunc
Func _IsFolder($name)
Return StringInStr(FileGetAttrib($name), "D")
EndFunc