|
■No46807 (魔界の仮面弁士 さん) に返信
エラー時にshfiの中身が
shfi.dwAttributes : 0
shfi.hIcon : 0
shfi.iIcon : 0
shfi.szDisplayName : ""
shfi.szTypeName : ""
となっているせいでエラーになるようです。
----
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttribs, out SHFILEINFO psfi, uint cbFileInfo, SHGFI uFlags);
[Flags]
public enum SHGFI
{
SHGFI_ICON = 0x000000100,
SHGFI_DISPLAYNAME = 0x000000200,
SHGFI_TYPENAME = 0x000000400,
SHGFI_LARGEICON = 0x000000000,
SHGFI_SMALLICON = 0x000000001,
SHGFI_OPENICON = 0x000000002,
SHGFI_USEFILEATTRIBUTES = 0x000000010
}
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
private void GetExplorerListviewFile(string dir)
{
IntPtr hImageSmall;
IntPtr hImageLarge;
int i = 0;
lvExplorer.Clear();
imageList32x.Images.Clear();
imageList16x.Images.Clear();
foreach (string s in System.IO.Directory.GetFileSystemEntries(dir))
{
ShellAPI.SHFILEINFO shfi = new ShellAPI.SHFILEINFO();
FileInfo fi = new FileInfo(s);
// アイコン取得
hImageLarge = ShellAPI.SHGetFileInfo(
s, 0, out shfi, (uint)Marshal.SizeOf(shfi),
ShellAPI.SHGFI.SHGFI_ICON | ShellAPI.SHGFI.SHGFI_LARGEICON);
imageList32x.Images.Add(Icon.FromHandle(shfi.hIcon));
hImageSmall = ShellAPI.SHGetFileInfo(
s, 0, out shfi, (uint)Marshal.SizeOf(shfi),
ShellAPI.SHGFI.SHGFI_ICON | ShellAPI.SHGFI.SHGFI_SMALLICON);
imageList16x.Images.Add(Icon.FromHandle(shfi.hIcon));
//リストビューにアイテムを追加
lvExplorer.Items.Add(
new ListViewItem(new string[]{fi.Name,Directory.GetCreationTime(fi.FullName).ToString(),
Directory.GetLastAccessTime(fi.FullName).ToString()}
, i++)
);
}
}
----
下記のサイトのコードでも実験してみましたが、同じエラーとなりました。
http://support.microsoft.com/kb/319350/ja
#適当な中国語に翻訳したファイル名のものを開く
|