将Windows SHFILEINFO转换为DotNet [英] Convert windows SHFILEINFO to DotNet
问题描述
需要这个:
typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName [MAX_PATH];
TCHAR szTypeName [80];
} SHFILEINFO
这就是我尝试过的:
公共结构SHFILEINFO
公共场所作为IntPtr
Public iIcon As Integer
Public dwAttributes as Integer
< MarshalAs(UnmanagedType.LPStr,SizeConst:= Kernel.MAX_PATH)> Public
szDisplayName As String
< MarshalAs(UnmanagedType.LPStr,SizeConst:= 80)>公共szTypeName为字符串
结束结构
Kernel.MAX_PATH等于260
修复它。
谢谢
" ** **开发" < RE ************* @ a-znet.com>在留言中写道
news:u%**************** @ TK2MSFTNGP14.phx.gbl ...需要这个:
typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName [MAX_PATH];
TCHAR szTypeName [80];
} SHFILEINFO
这就是我的尝试:
公共结构SHFILEINFO
Public hIcon As IntPtr
> Public iIcon As Integer
Public dwAttributes as Integer
< MarshalAs(UnmanagedType.LPStr,SizeConst:= Kernel.MAX_PATH)> Public
szDisplayName As String
< MarshalAs(UnmanagedType.LPStr,SizeConst:= 80)>公共szTypeName为
字符串
结束结构
Google是你的朋友!
http://www.google .com / search?biw = 951 ... = Google +搜索
来自
http://www.codeguru.com/vb/gen/vb_mi...cle.php/c5597 /
区别在于szDisplayName的UnmangedType
私人结构SHFILEINFO
公共hcon作为IntPtr'':icon
Public iIcon As Integer'':icondex
Public dwAttributes As Integer'':SFGAO_ flags
< MarshalAs (UnmanagedType.ByValTStr,SizeConst:= 260)> _
Public szDisplayName As String
< MarshalAs(UnmanagedType.ByValTStr,SizeConst:= 80)> _
公共szTypeName为字符串
结束结构
这是一个简单的例子。将listview控件添加到表单并
将其命名为lv。添加图像列表以形成名称imlIcon。
私有函数getLocalIcons(ByVal szFolderPath As String)
Dim dirInfo作为新的System.IO。 DirectoryInfo(szFolderPath)
Dim di As System.IO.DirectoryInfo
Dim fi As System.IO.FileInfo
Dim lvitem作为ListViewItem
Dim hIcon As Icon
Dim cIcon As new clsGetIcon
>
Dim htIcons As New Hashtable
Dim intIndex As Integer
imlIcon.Images.Clear()
lv.Items.Clear()
lv.SmallImageList = imlIcon
For each di in dirInfo.GetDirectories ()
lvitem = lv.Items.Add(di.Name)
hIcon = cIcon.getIcon(di.FullName)
如果htIcons.ContainsKey(hIcon)那么
intIndex = htIcons(hIcon)
Else
imlIcon.Images.Add(hIcon.ToBitmap)
intIndex = imlIc on.Images.Count - 1
结束如果
lvitem.ImageIndex = intIndex
下一页
For each fi in dirInfo.GetFiles()
lvitem = lv.Items.Add(fi.Name)
hIcon = cIcon.getIcon(fi.FullName)
如果htIcons.ContainsKey(hIcon)那么
intIndex = htIcons(hIcon)
Else
imlIcon.Images.Add(hIcon.ToBitmap)
intIndex = imlIcon.Images.Count - 1
结束如果
lvitem.ImageIndex = intIndex
>
下一页
结束功能
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As
System.EventArgs)处理MyBase.Load
lv.SuspendLayout()
getLocalIcons(" C:\" ;)
lv.ResumeLayout()
结束子
辅助类。
Imports System.Runtime.InteropServices
公共类clsGetIcon
公共结构SHFILEINFO
Dim hIcon作为IntPtr
Dim iIcon作为整数
Dim dwAttributes as Integer
< VBFixedString(260),
System.Runtime.InteropServices.MarshalAs(System.Ru ntime.InteropServices.UnmanagedType.ByValTStr,
SizeConst:= 260)>公共szDisplayName为字符串
''字符串,包含Microsoft中出现的文件名?
Windows? Shell,或包含代表文件的图标
的文件的路径和文件名。
< VBFixedString(80),
System.Runtime.InteropServices.MarshalAs(System.Ru ntime.InteropServices.UnmanagedType.ByValTStr,
SizeConst:= 80)>公共szTypeName为字符串
结束结构
私有声明自动功能SHGetFileInfo Lib" shell32" (ByVal pszPath As
String,_
ByVal dwFileAttributes As Integer,ByRef psfi As SHFILEINFO,_
ByVal cbFileInfo As Integer,ByVal uFlags as Integer)as Integer
Private Const SHGFI_ICON As Integer =& H100
Private Const SHGFI_SMALLICON As Integer =& H1''小图标
Private Const SHGFI_TYPENAME As Integer =& H400''获取类型名称
公共函数getIcon( ByVal szFilename As String)作为图标
尝试
将aSHFileInfo视为新的SHFILEINFO
Dim cbFileInfo As Integer = _
Marshal.SizeOf(aSHFileInfo)
Dim uflags As Integer = SHGFI_ICON或SHGFI_SMALLICON
>
SHGetFileInfo(szFilename,0,aSHFileInfo,cbFileInfo,uflags)
将myIcon视为图标
myIcon = Icon.FromHandle (aSHFileInfo.hIcon)
aSHFileInfo.szTypeName =空格(255)
SHGetFileInfo(szFilename,0,aSHFileInfo,cbFileInfo,SHGFI_TYPENAME)
Trace.WriteLine(aSHFileInfo.szTypeName)
返回myIcon
Catch ex As Exception
Debug.WriteLine(ex.ToString)
什么都不退货
结束尝试
结束功能
结束课程
肯
---------------------------
" ** **开发" < RE ************* @ a-znet.com>在留言中写道
news:u%**************** @ TK2MSFTNGP14.phx.gbl ...
需要这个:
typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName [MAX_PATH];
TCHAR szTypeName [80];
} SHFILEINFO
这就是我的尝试:
公共结构SHFILEINFO
公共网络作为IntPtr
Public iIcon As Integer
Public dwAttributes as Integer
< MarshalAs(UnmanagedType.LPStr,SizeConst:= Kernel.MAX_PATH)> Public
szDisplayName As String
< MarshalAs(UnmanagedType.LPStr,SizeConst:= 80)>公共szTypeName为字符串
结束结构
Kernel.MAX_PATH等于260
谢谢
" ** **开发" < RE ************* @ a-znet.com> schrieb:typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName [MAX_PATH];
TCHAR szTypeName [80];
} SHFILEINFO
[...]
< MarshalAs(UnmanagedType.LPStr,SizeConst:= Kernel.MAX_PATH)> Public
szDisplayName As String
< MarshalAs(UnmanagedType.LPStr,SizeConst:= 80)>公共szTypeName为
字符串
结束结构
字符串必须存储为''ByValTStr',这意味着它们存放在结构内部。
< URL:http://groups.google.to/groups?selm = u%23IVf5baFHA.1040 %40TK2MSFTNGP10.phx。 gbl>
-
MS Herfried K. Wagner
MVP< URL:http://dotnet.mvps。 org />
VB< URL:http://classicvb.org/petition/>
Need this:
typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName[MAX_PATH];
TCHAR szTypeName[80];
} SHFILEINFO
This is what I tried:
Public Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Integer
<MarshalAs(UnmanagedType.LPStr, SizeConst:=Kernel.MAX_PATH)> Public
szDisplayName As String
<MarshalAs(UnmanagedType.LPStr, SizeConst:=80)> Public szTypeName As String
End Structure
Kernel.MAX_PATH equals 260
But it doesn''t appear to work. Does it look OK to you or do you know how to
fix it.
Thanks
" **Developer**" <RE*************@a-znet.com> wrote in message
news:u%****************@TK2MSFTNGP14.phx.gbl...Need this:
typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName[MAX_PATH];
TCHAR szTypeName[80];
} SHFILEINFO
This is what I tried:
Public Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Integer
<MarshalAs(UnmanagedType.LPStr, SizeConst:=Kernel.MAX_PATH)> Public
szDisplayName As String
<MarshalAs(UnmanagedType.LPStr, SizeConst:=80)> Public szTypeName As
String
End Structure
Google is your friend!
http://www.google.com/search?biw=951...=Google+Search
From
http://www.codeguru.com/vb/gen/vb_mi...cle.php/c5597/
The difference is in the UnmangedType for szDisplayName
Private Structure SHFILEINFO
Public hIcon As IntPtr '' : icon
Public iIcon As Integer '' : icondex
Public dwAttributes As Integer '' : SFGAO_ flags
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTypeName As String
End Structure
Hi,
Here is a quick example. Add a listview control to the form and
name it lv. Add an imagelist to form name it imlIcon.
Private Function getLocalIcons(ByVal szFolderPath As String)
Dim dirInfo As New System.IO.DirectoryInfo(szFolderPath)
Dim di As System.IO.DirectoryInfo
Dim fi As System.IO.FileInfo
Dim lvitem As ListViewItem
Dim hIcon As Icon
Dim cIcon As New clsGetIcon
Dim htIcons As New Hashtable
Dim intIndex As Integer
imlIcon.Images.Clear()
lv.Items.Clear()
lv.SmallImageList = imlIcon
For Each di In dirInfo.GetDirectories()
lvitem = lv.Items.Add(di.Name)
hIcon = cIcon.getIcon(di.FullName)
If htIcons.ContainsKey(hIcon) Then
intIndex = htIcons(hIcon)
Else
imlIcon.Images.Add(hIcon.ToBitmap)
intIndex = imlIcon.Images.Count - 1
End If
lvitem.ImageIndex = intIndex
Next
For Each fi In dirInfo.GetFiles()
lvitem = lv.Items.Add(fi.Name)
hIcon = cIcon.getIcon(fi.FullName)
If htIcons.ContainsKey(hIcon) Then
intIndex = htIcons(hIcon)
Else
imlIcon.Images.Add(hIcon.ToBitmap)
intIndex = imlIcon.Images.Count - 1
End If
lvitem.ImageIndex = intIndex
Next
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
lv.SuspendLayout()
getLocalIcons("C:\")
lv.ResumeLayout()
End Sub
The helper class.
Imports System.Runtime.InteropServices
Public Class clsGetIcon
Public Structure SHFILEINFO
Dim hIcon As IntPtr
Dim iIcon As Integer
Dim dwAttributes As Integer
<VBFixedString(260),
System.Runtime.InteropServices.MarshalAs(System.Ru ntime.InteropServices.UnmanagedType.ByValTStr,
SizeConst:=260)> Public szDisplayName As String
''String that contains the name of the file as it appears in the Microsoft?
Windows? Shell, or the path and file name of the file that contains the icon
representing the file.
<VBFixedString(80),
System.Runtime.InteropServices.MarshalAs(System.Ru ntime.InteropServices.UnmanagedType.ByValTStr,
SizeConst:=80)> Public szTypeName As String
End Structure
Private Declare Auto Function SHGetFileInfo Lib "shell32" (ByVal pszPath As
String, _
ByVal dwFileAttributes As Integer, ByRef psfi As SHFILEINFO, _
ByVal cbFileInfo As Integer, ByVal uFlags As Integer) As Integer
Private Const SHGFI_ICON As Integer = &H100
Private Const SHGFI_SMALLICON As Integer = &H1 ''Small icon
Private Const SHGFI_TYPENAME As Integer = &H400 '' get type name
Public Function getIcon(ByVal szFilename As String) As Icon
Try
Dim aSHFileInfo As New SHFILEINFO
Dim cbFileInfo As Integer = _
Marshal.SizeOf(aSHFileInfo)
Dim uflags As Integer = SHGFI_ICON Or SHGFI_SMALLICON
SHGetFileInfo(szFilename, 0, aSHFileInfo, cbFileInfo, uflags)
Dim myIcon As Icon
myIcon = Icon.FromHandle(aSHFileInfo.hIcon)
aSHFileInfo.szTypeName = Space(255)
SHGetFileInfo(szFilename, 0, aSHFileInfo, cbFileInfo, SHGFI_TYPENAME)
Trace.WriteLine(aSHFileInfo.szTypeName)
Return myIcon
Catch ex As Exception
Debug.WriteLine(ex.ToString)
Return Nothing
End Try
End Function
End Class
Ken
---------------------------
" **Developer**" <RE*************@a-znet.com> wrote in message
news:u%****************@TK2MSFTNGP14.phx.gbl...
Need this:
typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName[MAX_PATH];
TCHAR szTypeName[80];
} SHFILEINFO
This is what I tried:
Public Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Integer
<MarshalAs(UnmanagedType.LPStr, SizeConst:=Kernel.MAX_PATH)> Public
szDisplayName As String
<MarshalAs(UnmanagedType.LPStr, SizeConst:=80)> Public szTypeName As String
End Structure
Kernel.MAX_PATH equals 260
But it doesn''t appear to work. Does it look OK to you or do you know how to
fix it.
Thanks
" **Developer**" <RE*************@a-znet.com> schrieb:typedef struct _SHFILEINFO {
HICON hIcon;
int iIcon;
DWORD dwAttributes;
TCHAR szDisplayName[MAX_PATH];
TCHAR szTypeName[80];
} SHFILEINFO
[...]
<MarshalAs(UnmanagedType.LPStr, SizeConst:=Kernel.MAX_PATH)> Public
szDisplayName As String
<MarshalAs(UnmanagedType.LPStr, SizeConst:=80)> Public szTypeName As
String
End Structure
The strings must be stored as ''ByValTStr''s, which means that they are stored
inside the structure.
<URL:http://groups.google.to/groups?selm=u%23IVf5baFHA.1040%40TK2MSFTNGP10.phx. gbl>
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>
这篇关于将Windows SHFILEINFO转换为DotNet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!