2014-06-10 29 views
0

我嘗試這樣做:如何拼湊SHGetFileInfo(c#)的unicode版本?

public struct SHFILEINFOW 
      { 
       public IntPtr hIcon; 
       public int iIcon; 
       public uint dwAttributes; 
       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260 * 2)] 
       public string szDisplayName; 
       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80 * 2)] 
       public string szTypeName; 
      } 
    [DllImport("shell32.dll")] 
      public static extern IntPtr SHGetFileInfoW(IntPtr pIDL, uint dwFileAttributes, out SHFILEINFOW psfi, uint cbFileInfo, SHGFI uFlags); 
    String DisplayName = shInfoW.szDisplayName; 

但是DisplayName的僅包含所述第一字符

+0

由於某些原因,http://www.pinvoke.net/default.aspx/shell32/SHGetFileInfo.html不適合您嗎? –

+0

我需要考慮實際問題;不過,我會明確地添加一個StructLayout屬性來使結構佈局順序。 – Markus

+0

SHGetFileInfo返回?????????對於名爲เอาขึ้นมามา้ม้ายย – Irwan

回答

3
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260 * 2)] 

ByValTStr意思是 「相同的類或結構」。但是你沒有爲結構指定CharSet屬性。它默認爲CharSet.Ansi,這樣字符串就像是一個8位字符串一樣被封送。由於真正的字符串是Unicode,因此只有獲得第一個字符纔會獲得很高的賠率。修復:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct SHFILEINFOW { 
    // etc... 
} 
+0

+1。你知道爲什麼'[DllImport(「shell32.dll」,CharSet = CharSet.Auto)]'/'[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Auto)]'建議在http://pinvoke.net不適用於OP? –

+0

[DllImport]的CharSet決定是否調用SHGetFileInfoW或SHGetFileInfoA。調用完成後,pinvoke編組人員開始轉換本地結構。由結構體上的CharSet屬性指導。 –

+0

@Alex:對不起,我的意思是我的原始代碼SHGetFileInfo。該頁面上的代碼也起作用 – Irwan