请教下,在参数中的 shinfo.hlcon 不是一个没赋值的变量吗?

题 完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Windows;
namespace _000
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public int nIndex=0;
private void button1_Click(object sender, EventArgs e)
{
IntPtr hImgSmall;
string fName;
SHFILEINFO shinfo = new SHFILEINFO();

OpenFileDialog openfileDialog1 = new OpenFileDialog();
openfileDialog1.InitialDirectory = "f:\\";
openfileDialog1.Filter = "(*.txt)|*.txt | All files(*.*)|*.*";

listView1.SmallImageList = imageList1;
listView1.LargeImageList = imageList1;

if (openfileDialog1.ShowDialog() == DialogResult.OK)
{
fName = openfileDialog1.FileName;
hImgSmall = Win32.SHGetFileInfo
(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo),
0x100/*win32.SHGFI_ICON*/);
System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);

imageList1.Images.Add(myIcon);
listView1.Items.Add(fName, nIndex++);
}

}
public struct SHFILEINFO
{

public IntPtr hIcon;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
}
class Win32
{
public const uint SHGFI_ICON = 0x100;

[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(
string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi,
uint cbSizeFileInfo, uint uFlags);
}

}
}

如题, [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;的用用处是什么? 代码中也没有见要用它,为什么删了代码却不能通过了?
还有
SHGetFileInfo(
string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi,
uint cbSizeFileInfo, uint uFlags)
的具体参数都是表示什么?
还有
System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
这句的做用是什么?

慕尼黑的夜晚无繁华
浏览 89回答 2
2回答

哈士奇WWW

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]应该是托管字符串转为非托管字符串,字符串大小是260SHGetFileInfo()参数,应该是文件路径,文件属性,结构体(图标与文件名),文件大小,标识

慕神8447489

用系统自带的rasdial.exe可以实现方法是 rasdial.exe 连接名称 用户名 密码连接名称是你创建的宽带连接名 如"宽带连接"System.Diagnostics.Process.Start("rasdial.exe", ADSLname.Text + " " + ADSLuser.Text + " " + ADSLpass.Text);断线 rasdial.exe 连接名称 disconnectSystem.Diagnostics.Process.Start("rasdial.exe", ADSLname.Text + " disconnect");using System;using System.Runtime.InteropServices;public struct RASCONN{public int dwSize;public IntPtr hrasconn;[MarshalAs(UnmanagedType.ByValTStr, SizeConst=257)]public string szEntryName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst=17)]public string szDeviceType;[MarshalAs(UnmanagedType.ByValTStr, SizeConst=129)]public string szDeviceName;}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]public struct RasStats{public int dwSize;public int dwBytesXmited;public int dwBytesRcved;public int dwFramesXmited;public int dwFramesRcved;public int dwCrcErr;public int dwTimeoutErr;public int dwAlignmentErr;public int dwHardwareOverrunErr;public int dwFramingErr;public int dwBufferOverrunErr;public int dwCompressionRatioIn;public int dwCompressionRatioOut;public int dwBps;public int dwConnectionDuration;}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]public struct RasEntryName{public int dwSize;//[MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxEntryName + 1)]public string szEntryName;//#if WINVER5// public int dwFlags;// [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260+1)]// public string szPhonebookPath;//#endif}public class RAS{[DllImport("Rasapi32.dll", EntryPoint="RasEnumConnectionsA",SetLastError=true)]internal static extern int RasEnumConnections(ref RASCONN lprasconn, // buffer to receive connections dataref int lpcb, // size in bytes of bufferref int lpcConnections // number of connections written to buffer);[DllImport("rasapi32.dll",CharSet=CharSet.Auto)]internal static extern uint RasGetConnectionStatistics(IntPtr hRasConn, // handle to the connection[In,Out]RasStats lpStatistics // buffer to receive statistics);[DllImport("rasapi32.dll",CharSet=CharSet.Auto)]public extern static uint RasHangUp(IntPtr hrasconn // handle to the RAS connection to hang up);[DllImport("rasapi32.dll",CharSet=CharSet.Auto)]public extern static uint RasEnumEntries (string reserved, // reserved, must be NULLstring lpszPhonebook, // pointer to full path and// file name of phone-book file[In,Out]RasEntryName[] lprasentryname, // buffer to receive// phone-book entriesref int lpcb, // size in bytes of bufferout int lpcEntries // number of entries written// to buffer);[DllImport("wininet.dll",CharSet=CharSet.Auto)]public extern static int InternetDial(IntPtr hwnd,[In]string lpszConnectoid,uint dwFlags,ref int lpdwConnection,uint dwReserved);public RAS(){}}public enum DEL_CACHE_TYPE //要删除的类型。{File,//表示internet临时文件Cookie //表示Cookie};public class RASDisplay{[DllImport("wininet.dll",CharSet=CharSet.Auto)]public static extern bool DeleteUrlCacheEntry(DEL_CACHE_TYPE type);private string m_duration;private string m_ConnectionName;private string[] m_ConnectionNames;private double m_TX;private double m_RX;private bool m_connected;private IntPtr m_ConnectedRasHandle;//RasStats status = new RasStats();public RASDisplay(){m_connected = true;RAS lpras = new RAS();RASCONN lprasConn = new RASCONN();lprasConn.dwSize = Marshal.SizeOf(typeof(RASCONN));lprasConn.hrasconn = IntPtr.Zero;int lpcb = 0;int lpcConnections = 0;int nRet = 0;lpcb = Marshal.SizeOf(typeof(RASCONN));nRet = RAS.RasEnumConnections(ref lprasConn, ref lpcb, reflpcConnections);if(nRet != 0){m_connected = false;return;}if(lpcConnections > 0){//for (int i = 0; i < lpcConnections; i++)//{RasStats stats = new RasStats();m_ConnectedRasHandle = lprasConn.hrasconn;RAS.RasGetConnectionStatistics(lprasConn.hrasconn, stats);m_ConnectionName = lprasConn.szEntryName;int Hours = 0;int Minutes = 0;int Seconds = 0;Hours = ((stats.dwConnectionDuration /1000) /3600);Minutes = ((stats.dwConnectionDuration /1000) /60) - (Hours * 60);Seconds = ((stats.dwConnectionDuration /1000)) - (Minutes * 60) - (Hours * 3600);m_duration = Hours + " hours " + Minutes + " minutes " + Seconds + " secs";m_TX = stats.dwBytesXmited;m_RX = stats.dwBytesRcved;//}}else{m_connected = false;}int lpNames = 1;int entryNameSize = 0;int lpSize = 0;RasEntryName[] names = null;entryNameSize=Marshal.SizeOf(typeof(RasEntryName));lpSize=lpNames*entryNameSize;names=new RasEntryName[lpNames];names[0].dwSize=entryNameSize;uint retval = RAS.RasEnumEntries(null,null,names,ref lpSize,out lpNames);//if we have more than one connection, we need to do it againif(lpNames > 1){names=new RasEntryName[lpNames];for(int i=0;i<names.Length;i++){names[i].dwSize=entryNameSize;}retval = RAS.RasEnumEntries(null,null,names,ref lpSize,out lpNames);}m_ConnectionNames = new string[names.Length];if(lpNames>0){for(int i=0;i<names.Length;i++){m_ConnectionNames[i] = names[i].szEntryName;}}}public string Duration{get{return m_connected ? m_duration : "";}}public string[] Connections{get{return m_ConnectionNames;}}public double BytesTransmitted{get{return m_connected ? m_TX : 0;}}public double BytesReceived{get{return m_connected ? m_RX : 0;}}public string ConnectionName{get{return m_connected ? m_ConnectionName : "";}}public bool IsConnected{get{return m_connected;}}public int Connect(string Connection){int temp = 0;uint INTERNET_AUTO_DIAL_UNATTENDED = 2;int retVal = RAS.InternetDial(IntPtr.Zero,Connection,INTERNET_AUTO_DIAL_UNATTENDED,ref temp,0);return retVal;}public void Disconnect(){RAS.RasHangUp(m_ConnectedRasHandle);}}用法是RASDisplay ras = new RASDisplay();ras.Disconnect();//断线ras.Connect("adsl");//拨号
打开App,查看更多内容
随时随地看视频慕课网APP