2013-11-22 7 views
1

SHGetFileInfo을 사용하여 파일 또는 디렉토리, 즉 아이콘 또는 설명에 대한 특정 정보를 검색합니다.SHGetFileInfo : 파일 확장자가 너무 짧음에 대한 설명

파일 확장명에 대한 설명을 검색 할 때 SHGetFileInfo에서 반환 된 문자열에는 처음 네 문자가 누락되었습니다. (나는 영어로 내가 생각 Application의, 독일어 해요로),하지만 난 단지 ndung를 얻을 예를 들어
.pdf 파일의 설명 Adobe Acrobat Document하지만 난 단지 e Acrobat Document 가져 오거나 .exe 파일의 설명 Anwendung입니다.

나는 SHGetFileInfo의 일반적인 구현

public static string GetFileTypeDescription(this FileInfo file) 
{ 
    SHFILEINFO shFileInfo; 
    if (SHGetFileInfo(
      file.Extension, 
      SHGFI_FILE_ATTRIBUTE_NORMAL, 
      out shFileInfo, 
      (uint)Marshal.SizeOf(typeof(SHFILEINFO)), 
      SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME) 
      != IntPtr.Zero) 
    { 
     return shFileInfo.szTypeName; 
    } 

    return null; 
} 

을 사용하고 있습니다 :

잘못 무엇입니까
[DllImport("shell32.dll")] 
internal static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); 

[StructLayout(LayoutKind.Sequential)] 
internal struct SHFILEINFO 
{ 
    public IntPtr hIcon; 
    public IntPtr iIcon; 
    public uint dwAttributes; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
    public string szDisplayName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
    public string szTypeName; 
}; 

//I omitted all flags which are not used above 
private const uint SHGFI_FILE_ATTRIBUTE_NORMAL = 0x80, 
        SHGFI_USEFILEATTRIBUTES = 0x10, 
        SHGFI_TYPENAME = 0x400; 

? 내가 뭐 놓친 거 없니? 또는 어떻게 전체 설명을 검색 할 수 있습니까?

답변

1

C++ 구조체의 iIcon 필드에는 int 유형이 있습니다. Windows에서 4 바이트 부호있는 정수입니다. C#의 int에 해당합니다.

C# 코드에서 필드를 IntPtr로 선언했습니다. 그것은 포인터와 같은 크기의 부호있는 정수입니다. 따라서 32 비트 코드에서는 4 바이트이고 64 비트 코드에서는 8 바이트입니다. 64 비트 코드를 실행하고있는 것 같습니다.

따라서 오류는이 필드의 선언이 잘못된 유형을 단순히가집니다. 해결책은 iIcon의 유형을 int로 변경하는 것입니다.

+0

설명 할 시간을내어 주셔서 감사합니다! 그래서 내 구조체는 4 바이트가 너무 큽니다 ...하지만'hIcon'은 어떨까요? C++ typedef에서는 더 많은 정보를 찾을 수없는'HICON' 타입이고 C#에서는'IntPtr'입니다. x86 및 x64 용으로 컴파일하여 테스트 해 보았습니다. 내 구조체는 x86에서 4 바이트가 짧을까요? –

+0

HICON은 포인터 크기입니다. 따라서 IntPtr은 올바른 번역입니다. Q 코드에서 시작하여 iIcon을 int로 변경해야하며 구조체가 올바르게 선언되어야합니다. –

+0

무슨 일이 일어나는지 더 자세히 설명하기 때문에 답을 수락하십시오. –

0

iIcon에서 IntPtr을 int로 변경하십시오. 그게 효과가있다. 또는 플랫폼 대상으로 x86을 사용하십시오. 둘 중 하나.

+0

iIcon에서 IntPtr을 int로 변경하십시오. 그게 효과가있다. 또는 플랫폼 대상으로 x86을 사용하십시오. 둘 중 하나. –

+0

'IntPtr'을'iIcon'에서'int'로 바꾸면 해결되었습니다 - 고마워요! 이유를 설명해 주시겠습니까? (또한 다른 사용자에게 유용하지 않으므로 답을 편집하고 전체 charset을 삭제하십시오.) –

+0

다음 msdn 게시물을보십시오. http://social.msdn.microsoft.com/Forums/en -US/60610aff-2dfd-4d52-9c4d-638d514100d0/calling-shgetfileinfo-in-c-win-x64. –

관련 문제