yo Leute,
hab mal eine Frage ob hierzu eventuell wer eine bessere Lösung hat.
Hintergrund: Ich speichere Dateipfade in eine Datenbank. Anzeigen tu ich diese in einem Grid welches eine Spalte "Icon" besitzt. Hier zeige ich dann das dementsprechende Icon der Datei an.
Das Icon lese ich mit folgender API:
Spoiler anzeigen
Hab das so in eine Klasse gepackt. Den Code an sich hab ich irgendwo ausn Internet.
Code funktioniert pipifein.
Jedoch dauert es je Aufruf rund 100ms. Hab ich nun 10 so Dateien anzuzeigen bin ich gleich mal bei einer Sekunde.
- Kann man Icon auslesen irgendwie beschleunigen bzw. gibt es eine andere Möglichkeit?
- Ich greife persönlich nicht so gerne Win-APIs an. Können irgendwelche Probleme mit solchen APIs auftreten?
lg
fichz
hab mal eine Frage ob hierzu eventuell wer eine bessere Lösung hat.
Hintergrund: Ich speichere Dateipfade in eine Datenbank. Anzeigen tu ich diese in einem Grid welches eine Spalte "Icon" besitzt. Hier zeige ich dann das dementsprechende Icon der Datei an.
Das Icon lese ich mit folgender API:
Visual Basic-Quellcode
- Namespace Helpers
- Public Class IconExtractor
- ' Constants that we need in the function call
- Private Const SHGFI_ICON As Integer = &H100
- Private Const SHGFI_SMALLICON As Integer = &H1
- Private Const SHGFI_LARGEICON As Integer = &H0
- ' This structure will contain information about the file
- Public Structure SHFILEINFO
- ' Handle to the icon representing the file
- Public hIcon As IntPtr
- ' Index of the icon within the image list
- Public iIcon As Integer
- ' Various attributes of the file
- Public dwAttributes As UInteger
- ' Path to the file
- <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
- Public szDisplayName As String
- ' File type
- <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
- Public szTypeName As String
- End Structure
- ' The signature of SHGetFileInfo (located in Shell32.dll)
- <DllImport("Shell32.dll")> _
- Public Shared Function SHGetFileInfo(pszPath As String, dwFileAttributes As UInteger, ByRef psfi As SHFILEINFO, cbFileInfo As Integer, uFlags As UInteger) As IntPtr
- End Function
- ''' <summary>
- ''' Gibt ein kleines Icon retour
- ''' </summary>
- ''' <param name="FileName">Pfad zur Datei</param>
- ''' <returns></returns>
- ''' <remarks></remarks>
- Public Function GetSmallIcon(ByVal FileName As String) As Icon
- Return GetIcon(FileName, IconSize.Small)
- End Function
- ''' <summary>
- ''' Gibt ein großes Icon retour
- ''' </summary>
- ''' <param name="FileName">Pfad zur Datei</param>
- ''' <returns></returns>
- ''' <remarks></remarks>
- Public Function GetLargeIcon(ByVal FileName As String) As Icon
- Return GetIcon(FileName, IconSize.Large)
- End Function
- Private Function GetIcon(ByVal FileName As String, ByVal Size As IconSize) As Icon
- If Not System.IO.File.Exists(FileName) Then
- Throw New System.IO.FileNotFoundException()
- End If
- ' Will store a handle to the small icon
- Dim hImg As IntPtr
- Dim shinfo As New SHFILEINFO()
- ' Sore the icon in this myIcon object
- Dim myIcon As System.Drawing.Icon
- Select Case Size
- Case IconSize.Small
- ' Get a handle to the small icon
- hImg = SHGetFileInfo(FileName, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)
- Case IconSize.Large
- ' Get a handle to the large icon
- hImg = SHGetFileInfo(FileName, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_LARGEICON)
- End Select
- ' Get the icon from the handle
- myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon)
- Return myIcon
- End Function
- Private Enum IconSize
- Small
- Large
- End Enum
- End Class
- End Namespace
Hab das so in eine Klasse gepackt. Den Code an sich hab ich irgendwo ausn Internet.
Code funktioniert pipifein.
Jedoch dauert es je Aufruf rund 100ms. Hab ich nun 10 so Dateien anzuzeigen bin ich gleich mal bei einer Sekunde.
- Kann man Icon auslesen irgendwie beschleunigen bzw. gibt es eine andere Möglichkeit?
- Ich greife persönlich nicht so gerne Win-APIs an. Können irgendwelche Probleme mit solchen APIs auftreten?
lg
fichz
ScheduleLib 0.0.1.0
Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten