Handle ist nicht mehr gültig...

27/08/2009 - 11:31 von Andreas Mahub | Report spam
Hi,

ich habe folgendes Problem. Ich habe eine Funktion, welche FileIcons zurück
geben soll. Diese habe ich sauber in eine Klasse verfrachtet. Diese Klasse
wird beim aufrufen der WinForm global als Private ganz am Anfang
instanziert, also:
Private FileIconClass as New FileTools.FileIcons

So, wenn das Verzeichnis abgerufen wird, funktioniert das Tool einwandfrei.
Für alle ca. 15 Dateien bekomme ich die Icons und diese werden in der
Listview dargestellt. Dabei wird FileTools.FileIcons zu keiner Zeit
zerstört, neu instanziert oder sonst was.

Rufe ich ein zweites Verzeichnis ab, dann kommt die Fehlermeldung das das
Handle nicht mehr gültig wàre. Die Funktion die ich im Netz gefunden habe
sieht so aus:
Public Function GetFileIcon(ByVal fname As String) As Icon
Dim hImgSmall As IntPtr 'The handle to the system image list.
Dim hImgLarge As IntPtr 'The handle to the system image list.
Dim shinfo As SHFILEINFO
shinfo = New SHFILEINFO()

shinfo.szDisplayName = New String(Chr(0), 260)
shinfo.szTypeName = New String(Chr(0), 80)

'Use this to get the small icon.
'hImgSmall = SHGetFileInfo(fname, 0, shinfo, _
' Marshal.SizeOf(shinfo), _
' SHGFI_ICON Or SHGFI_SMALLICON)

'Use this to get the large icon.
hImgLarge = SHGetFileInfo(fname, 0, _
shinfo, Marshal.SizeOf(shinfo), _
SHGFI_ICON Or SHGFI_LARGEICON)

Try
Dim myIcon As System.Drawing.Icon =
System.Drawing.Icon.FromHandle(shinfo.hIcon)
Return myIcon

Catch ex As Exception
'MsgBox(ex.Message)

Return Nothing

End Try

Und in dieser Zeile bleibt das Programm stehen:
Dim myIcon As System.Drawing.Icon =
System.Drawing.Icon.FromHandle(shinfo.hIcon)
In der Variable shinfo.hIcon ist auch eine 0 drin.
Weiss einer warum das passiert?
Ach ja, auch wenn ich in meiner Event-Routine "DirectoryLoaded" die Klasse
immer neu instanziere kann nur beim ersten Versuch die gesamten FileIcons
"gezogen" werden. Wird das Event ein zweites mal aufgerufen (also nach einem
Verzeichniswechsel) bekomme ich sofort beim ersten Icon diese Fehlermeldung:
Der an Icon übergebene Win32-Handle ist ungültig oder hat den falschen Typ.

Gruß
Andy
 

Lesen sie die antworten

#1 Armin Zingler
27/08/2009 - 17:58 | Warnen spam
Andreas Mahub schrieb:
Hi,

ich habe folgendes Problem. Ich habe eine Funktion, welche FileIcons zurück
geben soll. Diese habe ich sauber in eine Klasse verfrachtet. Diese Klasse
wird beim aufrufen der WinForm global als Private ganz am Anfang
instanziert, also:
Private FileIconClass as New FileTools.FileIcons



Ich versteh so einiges leider nicht:
Wo ist die Funktion, die FileIcons zurückgibt? Ist die Funktion
relevant? Die Funktion unten (GetFileIcon) gibt nur ein Icon zurück.


So, wenn das Verzeichnis abgerufen wird, funktioniert das Tool einwandfrei.



Wie wird das Verzeichnis abgerufen?

Für alle ca. 15 Dateien bekomme ich die Icons und diese werden in der
Listview dargestellt. Dabei wird FileTools.FileIcons zu keiner Zeit
zerstört, neu instanziert oder sonst was.



Inwiefern sind Instanzen von 'FileIcons' von Interesse? Welche Felder
hat die Klasse und was hat das mit dem Problem zu tun?

Rufe ich ein zweites Verzeichnis ab, dann kommt die Fehlermeldung das das
Handle nicht mehr gültig wàre. Die Funktion die ich im Netz gefunden habe
sieht so aus:
Public Function GetFileIcon(ByVal fname As String) As Icon
Dim hImgSmall As IntPtr 'The handle to the system image list.
Dim hImgLarge As IntPtr 'The handle to the system image list.
Dim shinfo As SHFILEINFO
shinfo = New SHFILEINFO()

shinfo.szDisplayName = New String(Chr(0), 260)
shinfo.szTypeName = New String(Chr(0), 80)

'Use this to get the small icon.
'hImgSmall = SHGetFileInfo(fname, 0, shinfo, _
' Marshal.SizeOf(shinfo), _
' SHGFI_ICON Or SHGFI_SMALLICON)

'Use this to get the large icon.
hImgLarge = SHGetFileInfo(fname, 0, _
shinfo, Marshal.SizeOf(shinfo), _
SHGFI_ICON Or SHGFI_LARGEICON)

Try
Dim myIcon As System.Drawing.Icon =
System.Drawing.Icon.FromHandle(shinfo.hIcon)
Return myIcon

Catch ex As Exception
'MsgBox(ex.Message)

Return Nothing

End Try



Poste mal die Deklarationen von SHGetFileInfo und SHFILEINFO

Und in dieser Zeile bleibt das Programm stehen:
Dim myIcon As System.Drawing.Icon =
System.Drawing.Icon.FromHandle(shinfo.hIcon)
In der Variable shinfo.hIcon ist auch eine 0 drin.
Weiss einer warum das passiert?
Ach ja, auch wenn ich in meiner Event-Routine "DirectoryLoaded"



Die Routine behandelt das Ereignis welcher Klasse?


die Klasse
immer neu instanziere



Die Klasse FileIcons?

kann nur beim ersten Versuch die gesamten FileIcons
"gezogen" werden. Wird das Event ein zweites mal aufgerufen (also nach einem
Verzeichniswechsel) bekomme ich sofort beim ersten Icon diese Fehlermeldung:
Der an Icon übergebene Win32-Handle ist ungültig oder hat den falschen Typ.



Was passiert denn im Ereignishandler, der das verursacht? Außer der
Instanziierung von (vermutlich) FileIcons weiß ich von nichts.


Armin

Ähnliche fragen