2009-10-11 3 views
4

가능합니까? 그것은 나에게 오류를 준다. 그리고 나는 이전에 그것이 폴더와 드라이브를 위해서도 작동 할 수 있다고 생각했다.Icon.ExtractAssociatedIcon은 파일이 아닌 것에 대한 것입니까?

Icon.ExtractAssociatedIcon ("C : \")이 시도 할 때 작동하지 않아 오류가 발생했습니다.

어떻게 모든 항목에서 관련 아이콘을 얻을 수 있습니까? 이것은 vb.net입니다

답변

5

SHGetFileInfo() 셸 함수는 찾고있는 아이콘을 제공 할 수 있습니다. 이 코드는 드라이브, 폴더 및 파일에 대한 적절한 아이콘을 생성, 잘 작동 :

Imports System.Drawing 
Imports System.Reflection 
Imports System.Runtime.InteropServices 

Public Module NativeMethods 
    Public Function GetShellIcon(ByVal path As String) As Icon 
    Dim info As SHFILEINFO = New SHFILEINFO() 
    Dim retval as IntPtr = SHGetFileInfo(path, 0, info, Marshal.SizeOf(info), &H100) 
    If retval = IntPtr.Zero Then Throw New ApplicationException("Could not retrieve icon") 
    '' Invoke private Icon constructor so we do not have to copy the icon 
    Dim cargt() As Type = { GetType(IntPtr) } 
    Dim ci As ConstructorInfo = GetType(Icon).GetConstructor(BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, cargt, Nothing) 
    Dim cargs() As Object = { info.IconHandle } 
    Dim icon As Icon = CType(ci.Invoke(cargs), Icon) 
    Return icon 
    End Function 

    '' P/Invoke declaration 
    Private Structure SHFILEINFO 
    Public IconHandle As IntPtr 
    Public IconIndex As Integer 
    Public Attributes As Integer 
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _ 
    Public DisplayString As String 
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _ 
    Public TypeName As String 
    End Structure 

    Private Declare Auto Function SHGetFileInfo lib "Shell32.dll" (path As String, _ 
    attributes As Integer, byref info As SHFILEINFO, infoSize As Integer, flags As Integer) As IntPtr 

End Module 
+0

내 답변에 따르면 [여기] (http://stackoverflow.com/a/21613348/939213) CLR은 자동으로 [SHGetFileInfo docs]와 일치하는 IntPtr을 해제하지 않습니다 (http : // msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx)'DestroyIcon'을 사용하여 자유롭게 할 책임이 있습니다. 그래서 당신의 코드가 여기에'DestroyIcon'을 놓치지 않았습니까? (저는 여기서 완전히 벗어 났을 것입니다 .BB.net을 알지 못합니다.) – ispiro

+1

아니요. ConstructorInfo 트릭이 전부입니다. Icon 클래스가 현재 핸들을 소유하고 있음을 알립니다. 개체가 가비지 수집 될 때 자동으로 DestroyIcon이 호출되도록합니다. Icon 객체가 어디에도 사용되지 않을 것이라는 확실한 보장이있을 때까지는 DestroyIcon을 호출하는 것이 타당하지 않으므로 다른 방법을 사용하는 것은 매우 어렵습니다. –

+0

감사합니다. 나는 (코드에서) 당신이'icon2 = (Icon) icon1.Clone();을 할 필요가 있다는 것을 당신의 의견에서 깨달았다. 등. 나는 또한 아이콘을 파괴하는 것을 처리 할 것임을 깨닫지 못했다. 좋은. 다시 한번 감사드립니다. – ispiro

1

파일 이외의 다른 것에는 Icon.ExtractAssociatedIcon을 사용할 수 없습니다. 이 API는 Win32 호출 ExtractAssociatedIcon의 맨 위에있는 얇은 래퍼입니다. 관리되는 코드의 설명서가 약간 모호하지만 원시 문서는 대상이 파일이어야한다는 점이 훨씬 명확합니다. 그것은 실행 파일이어야한다고 말합니다.

안타깝게도 디렉토리에 상응하는 기능이 있는지 여부는 확실하지 않습니다.

+0

아야>< 폴더가 드라이브 또는 표준 폴더인지 여부를 알 수있는 방법이 있나요.? – Cyclone

관련 문제