将Windows SHFILEINFO转换为DotNet [英] Convert windows SHFILEINFO to DotNet

查看:49
本文介绍了将Windows SHFILEINFO转换为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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆