Hallo Leute,
nun bin ich an einem Punkt, wo es nicht mehr weitergeht - darum bitte ich Euch um Hilfe.
Das Problem-Programm ist eigentlich sehr simpel.
Es ist ein ListView, das mit Verzeichnissen und Dateien ab einem Startverzeichnis gefüllt wird.
Dabei werden auch noch die kleinen Icons, passend zur Datei bereitgestellt (via SHGetFileInfo und "shell32.dll") und im ListView angezeigt.
So oder ähnlich findet man es oft im Web..
Meine Testumgebung ist Windows7 64Bit, administrativer Account.
1. Beim Programmstart wird das Startverzeichnis "C:\Windows\System32" übergeben - StartButton drücken - alles ok - alle verzeichnisse und Dateien werden angezeigt und die Icons kommen auch komplett.
2. Nochmal "Start" drücken - gleiches Startverzeichnis -> eine Fehlermeldung kommt und die Dateiliste ist nicht komplett.
3. Nochmal "Start" drücken - Programm friert ohne Fehlermeldung komplett ein und lässt sich nur noch im Taskmanager abschiessen.
Irgendwie kommt kein Icon-Index und damit keine Zuordnung eines Icons zur ImageList.
Aber nach vielen vielen Stunden sehe ich den Wald vor lauter Bäumen nicht mehr.
Bitte helft mir ein wenig - ok?
Spoiler anzeigen
Achso: die Problemfälle sind "C:\Windows\Sytem32" und "C:\Windows\Fonts" (hier knallt es gleich!)
Anbei die Screenshots, das Programm und das Projekt.
LG,
Bruno
nun bin ich an einem Punkt, wo es nicht mehr weitergeht - darum bitte ich Euch um Hilfe.
Das Problem-Programm ist eigentlich sehr simpel.
Es ist ein ListView, das mit Verzeichnissen und Dateien ab einem Startverzeichnis gefüllt wird.
Dabei werden auch noch die kleinen Icons, passend zur Datei bereitgestellt (via SHGetFileInfo und "shell32.dll") und im ListView angezeigt.
So oder ähnlich findet man es oft im Web..
Meine Testumgebung ist Windows7 64Bit, administrativer Account.
1. Beim Programmstart wird das Startverzeichnis "C:\Windows\System32" übergeben - StartButton drücken - alles ok - alle verzeichnisse und Dateien werden angezeigt und die Icons kommen auch komplett.
2. Nochmal "Start" drücken - gleiches Startverzeichnis -> eine Fehlermeldung kommt und die Dateiliste ist nicht komplett.
3. Nochmal "Start" drücken - Programm friert ohne Fehlermeldung komplett ein und lässt sich nur noch im Taskmanager abschiessen.
Irgendwie kommt kein Icon-Index und damit keine Zuordnung eines Icons zur ImageList.
Aber nach vielen vielen Stunden sehe ich den Wald vor lauter Bäumen nicht mehr.
Bitte helft mir ein wenig - ok?
VB.NET-Quellcode
- Imports System
- Imports System.IO
- Imports System.Runtime.InteropServices
- Public Class frmMain
- Private Structure SHFILEINFO
- Public hIcon As IntPtr
- Public iIcon As Integer
- Public dwAttributes As Integer
- <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
- Public szDisplayName As String
- <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
- Public szTypeName As String
- End Structure
- Private Declare Auto Function SHGetFileInfo Lib "shell32.dll" _
- (ByVal pszPath As String, ByVal dwFileAttributes As Integer, _
- ByRef psfi As SHFILEINFO, ByVal cbFileInfo As Integer, _
- ByVal uFlags As Integer) As IntPtr
- Private Const SHGFI_ICON = &H100
- Private Const SHGFI_SMALLICON = &H1
- Private Const SHGFI_LARGEICON = &H0
- Friend nIndex As Long = 0
- Dim hImgSmall As IntPtr
- Dim shinfo As SHFILEINFO
- '// Form Load
- Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- '// ListView einstellen
- With ListView1
- .SmallImageList = ImageList1
- .View = View.Details
- .Columns.Add("Name", 200, HorizontalAlignment.Left)
- .Columns.Add("Erw.", 60, HorizontalAlignment.Left)
- .Columns.Add("Erstellt", 120, HorizontalAlignment.Left)
- End With
- shinfo.szDisplayName = New String(Chr(0), 260)
- shinfo.szTypeName = New String(Chr(0), 80)
- End Sub
- '// Button Start
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- ListFiles(TextBox1.Text)
- End Sub
- '// ListView mit Diretorys und Files füllen
- Private Sub ListFiles(ByVal sStartDir As String)
- shinfo = New SHFILEINFO()
- Dim hImgSmall As IntPtr = Nothing
- Dim SubItemIndex As Integer
- '// ListView leeren, ImageListe leeren
- ListView1.Items.Clear()
- ImageList1.Images.Clear()
- '// Eieruhr
- Me.Cursor = Cursors.WaitCursor
- ListView1.BeginUpdate()
- '// Verzeichnisse
- Try
- For Each fDirs As String In IO.Directory.GetDirectories(sStartDir)
- hImgSmall = SHGetFileInfo(fDirs.ToString, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)
- ImageList1.Images.Add(System.Drawing.Icon.FromHandle(shinfo.hIcon))
- ListView1.Items.Add(System.IO.Path.GetFileName(fDirs), SubItemIndex)
- ListView1.Items(SubItemIndex).SubItems.Add("<DIR>")
- ListView1.Items(SubItemIndex).SubItems.Add(IO.File.GetCreationTime(fDirs).ToString("dd.MM.yyyy hh:mm"))
- SubItemIndex += 1
- Next
- Catch ex As Exception
- MsgBox(ex.ToString)
- End Try
- '// Files
- Try
- For Each file As String In IO.Directory.GetFiles(sStartDir)
- hImgSmall = SHGetFileInfo(file.ToString, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)
- ImageList1.Images.Add(System.Drawing.Icon.FromHandle(shinfo.hIcon))
- ListView1.Items.Add(System.IO.Path.GetFileName(file), SubItemIndex)
- ListView1.Items(SubItemIndex).SubItems.Add(IO.Path.GetExtension(file))
- ListView1.Items(SubItemIndex).SubItems.Add(IO.File.GetCreationTime(file).ToString("dd.MM.yyyy hh:mm"))
- SubItemIndex += 1
- Next
- Catch ex As Exception
- MsgBox(ex.ToString)
- End Try
- ListView1.EndUpdate()
- Me.Cursor = Cursors.Default
- End Sub
- End Class
Achso: die Problemfälle sind "C:\Windows\Sytem32" und "C:\Windows\Fonts" (hier knallt es gleich!)
Anbei die Screenshots, das Programm und das Projekt.
LG,
Bruno
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „diylab“ ()