获取计算机硬件信息的VB.NET代码范例

2012-06-08 16:52:41  阅读 4521 次 评论 0 条
得到显示器分辨率
           
           
              本文相关代码如下:
Dim X As Short = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width
           Dim Y As Short = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height
           MsgBox("您的显示器分辨率是:" & X & " X " & Y)

           
           得到特殊文件夹的路径
           
           
              本文相关代码如下:
'"Desktop"桌面文件夹路径
           MsgBox(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory))
           '"Favorites"收藏夹路径
           MsgBox(Environment.GetFolderPath(Environment.SpecialFolder.Favorites))
           '"Application Data"路径
           MsgBox(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))
           '通用写法
           'Dim SPEC As String = Environment.GetFolderPath(Environment.SpecialFolder.XXXXXXX)
           'XXXXXXX是特殊文件夹的名字

           
           得到操作系统版本信息
           
           
              本文相关代码如下:
MsgBox(Environment.OSVersion.ToString)

           
           得到当前登录的用户名
           
           
              本文相关代码如下:
MsgBox(Environment.UserName)

           
           得到当前应用程序的路径
           
           
              本文相关代码如下:
MsgBox(Environment.CurrentDirectory)

           
           打开和关闭CD-ROM
           
           
              本文相关代码如下:
'先新建模块
           Module mciAPIModule
           Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
           (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
           ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
           End Module
           '打开CD-ROM
           Dim lRet As Long
           lRet = mciSendString("set cdAudio door open", 0&, 0, 0)
           '关闭CD-ROM
           Dim lRet As Long
           lRet = mciSendString("set cdAudio door Closed", 0&, 0, 0)
           '更多请参见
           http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/mmcmdstr_8eyc.asp

           
           得到计算机IP和计算机全名
           
           
              本文相关代码如下:
Dim MYIP As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)
           MsgBox("您的IP地址:" & (MYIP.AddressList.GetValue(0).ToString))
           MsgBox("您的计算机全名:" & (MYIP.HostName.ToString))

           
           使用win32_operatingSystem (wmi Class)得到计算机信息
           
           
              本文相关代码如下:
'添加ListBox在Form1_Load事件里,并引用system.Managment
           Dim opSearch As New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
           Dim opInfo As ManagementObject
           For Each opInfo In opSearch.Get()
           ListBox1.Items.Add("Name: " & opInfo("name").ToString())
           ListBox1.Items.Add("Version: " & opInfo("version").ToString())
           ListBox1.Items.Add("Manufacturer: " & opInfo("manufacturer").ToString())
           ListBox1.Items.Add("Computer name: " & opInfo("csname").ToString())
           ListBox1.Items.Add("Windows Directory: " & opInfo("windowsdirectory").ToString())
           Next

           
           列出计算机安装的全部字体,并添加到ListBox
           
           
              本文相关代码如下:
'新建Form并添加ListBox和Button
           Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
           Dim fntCollection As InstalledFontCollection = New InstalledFontCollection()
           Dim fntFamily() As FontFamily
           fntFamily = fntCollection.Families
           ListBox1.Items.Clear()
           Dim i As Integer = 0
           For i = 0 To fntFamily.Length - 1
           ListBox1.Items.Add(fntFamily(i).Name)
           Next
           End Sub

           
           使用Win32_Processor列出处理器的信息
           
           
              本文相关代码如下:
Imports System.Management
           Public Class Form1
           Inherits System.Windows.Forms.Form
           #Region " Windows 窗体设计器生成的代码 "
           Public Sub New()
             MyBase.New()
             '该调用是 Windows 窗体设计器所必需的。
             InitializeComponent()
             '在 InitializeComponent() 调用之后添加任何初始化
           End Sub
           '窗体重写 dispose 以清理组件列表。
           Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
             If disposing Then
               If Not (components Is Nothing) Then
                 components.Dispose()
               End If
             End If
             MyBase.Dispose(disposing)
           End Sub
           'Windows 窗体设计器所必需的
           Private components As System.ComponentModel.IContainer
           '注意: 以下过程是 Windows 窗体设计器所必需的
           '可以使用 Windows 窗体设计器修改此过程。
           '不要使用代码编辑器修改它。
           Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
           Friend WithEvents Button1 As System.Windows.Forms.Button
           <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
             Me.ListBox1 = New System.Windows.Forms.ListBox
             Me.Button1 = New System.Windows.Forms.Button
             Me.SuspendLayout()
             '
             'ListBox1
             '
             Me.ListBox1.Location = New System.Drawing.Point(8, 8)
             Me.ListBox1.Name = "ListBox1"
             Me.ListBox1.Size = New System.Drawing.Size(280, 186)
             Me.ListBox1.TabIndex = 0
             '
             'Button1
             '
             Me.Button1.Location = New System.Drawing.Point(56, 208)
             Me.Button1.Name = "Button1"
             Me.Button1.Size = New System.Drawing.Size(168, 32)
             Me.Button1.TabIndex = 1
             Me.Button1.Text = "装载计算机处理器信息"
             '
             'Form1
             '
             Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
             Me.ClientSize = New System.Drawing.Size(296, 254)
             Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1, Me.ListBox1})
             Me.Text = "计算机处理器信息"
             Me.ResumeLayout(False)
           End Sub
           #End Region
           Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
               Handles Button1.Click
             Dim ProcQuery As New SelectQuery("Win32_Processor")
             Dim ProcSearch As New ManagementObjectSearcher(ProcQuery)
             Dim ProcInfo As ManagementObject
             For Each ProcInfo In ProcSearch.Get()
               Call processorfamily(ProcInfo("Family").ToString)
               ListBox1.Items.Add("Description: " & ProcInfo("Description").ToString())
               ListBox1.Items.Add("caption: " & ProcInfo("caption").ToString())
               ListBox1.Items.Add("Architecture: " & ProcInfo("Architecture").ToString())
               Call processortype(ProcInfo("ProcessorType").ToString())
               Call CpuStat(ProcInfo("CpuStatus").ToString)
               ListBox1.Items.Add("MaxClockSpeed: " & ProcInfo("MaxClockSpeed").ToString() & "MHZ")
               ListBox1.Items.Add("L2CacheSpeed: " & ProcInfo("L2CacheSpeed").ToString() & "MHZ")
               ListBox1.Items.Add("ExtClock: " & ProcInfo("L2CacheSpeed").ToString() & "MHZ")
               ListBox1.Items.Add("ProcessorId: " & ProcInfo("ProcessorId").ToString())
               ListBox1.Items.Add("AddressWidth: " & ProcInfo("AddressWidth").ToString() & "Bits")
               ListBox1.Items.Add("DataWidth: " & ProcInfo("DataWidth").ToString() & "Bits")
               ListBox1.Items.Add("Version: " & ProcInfo("Version").ToString())
               ListBox1.Items.Add("ExtClock: " & ProcInfo("ExtClock").ToString() & "MHZ")
             Next
           End Sub
           Function processorfamily(ByVal procssfam)
             Dim processtype
             Select Case procssfam
               Case 1
                 processtype = "Other"
               Case 2
                 processtype = "Unknown "
               Case 3
                 processtype = "8086 "
               Case 4
                 processtype = "80286 "
               Case 5
                 processtype = "80386 "
               Case 6
                 processtype = "80486 "
               Case 7
                 processtype = "8087 "
               Case 8
                 processtype = "80287 "
               Case 9
                 processtype = "80387 "
               Case 10
                 processtype = "80487 "
               Case 11
                 processtype = "Pentium brand "
               Case 12
                 processtype = "Pentium Pro "
               Case 13
                 processtype = "Pentium II "
               Case 14
                 processtype = "Pentium processor with MMX technology "
               Case 15
                 processtype = "Celeron "
               Case 16
                 processtype = "Pentium II Xeon "
               Case 17
                 processtype = "Pentium III "
               Case 18
                 processtype = "M1 Family "
               Case 19
                 processtype = "M2 Family "
               Case 24
                 processtype = "K5 Family "
               Case 25
                 processtype = "K6 Family "
               Case 26
                 processtype = "K6-2 "
               Case 27
                 processtype = "K6-3 "
               Case 28
                 processtype = "AMD Athlon Processor Family "
               Case 29
                 processtype = "AMD Duron Processor "
               Case 30
                 processtype = "AMD2900 Family "
               Case 31
                 processtype = "K6-2+ "
               Case 32
                 processtype = "Power PC Family "
               Case 33
                 processtype = "Power PC 601 "
               Case 34
                 processtype = "Power PC 603 "
               Case 35
                 processtype = "Power PC 603+ "
               Case 36
                 processtype = "Power PC 604 "
               Case 37
                 processtype = "Power PC 620 "
               Case 38
                 processtype = "Power PC X704 "
               Case 39
                 processtype = "Power PC 750 "
               Case 48
                 processtype = "Alpha Family "
               Case 49
                 processtype = "Alpha 21064 "
               Case 50
                 processtype = "Alpha 21066 "
               Case 51
                 processtype = "Alpha 21164 "
               Case 52
                 processtype = "Alpha 21164PC "
               Case 53
                 processtype = "Alpha 21164a "
               Case 54
                 processtype = "Alpha 21264 "
               Case 55
                 processtype = "Alpha 21364 "
               Case 64
                 processtype = "MIPS Family "
               Case 65
                 processtype = "MIPS R4000 "
               Case 66
                 processtype = "MIPS R4200 "
               Case 67
                 processtype = "MIPS R4400 "
               Case 68
                 processtype = "MIPS R4600 "
               Case 69
                 processtype = "MIPS R10000 "
               Case 80
                 processtype = "SPARC Family "
               Case 81
                 processtype = "SuperSPARC "
               Case 82
                 processtype = "microSPARC II "
               Case 83
                 processtype = "microSPARC IIep "
               Case 84
                 processtype = "UltraSPARC "
               Case 85
                 processtype = "UltraSPARC II "
               Case 86
                 processtype = "UltraSPARC IIi "
               Case 87
                 processtype = "UltraSPARC III "
               Case 88
                 processtype = "UltraSPARC IIIi "
               Case 96
                 processtype = "68040 "
               Case 97
                 processtype = "68xxx Family "
               Case 98
                 processtype = "68000 "
               Case 99
                 processtype = "68010 "
               Case 100
                 processtype = "68020 "
               Case 101
                 processtype = "68030 "
               Case 112
                 processtype = "Hobbit Family "
               Case 120
                 processtype = "Crusoe TM5000 Family "
               Case 121
                 processtype = "Crusoe TM3000 Family "
               Case 128
                 processtype = "Weitek "
               Case 130
                 processtype = "Itanium Processor "
               Case 144
                 processtype = "PA-RISC Family "
               Case 145
                 processtype = "PA-RISC 8500 "
               Case 146
                 processtype = "PA-RISC 8000 "
               Case 147
                 processtype = "PA-RISC 7300LC "
               Case 148
                 processtype = "PA-RISC 7200 "
               Case 149
                 processtype = "PA-RISC 7100LC "
               Case 150
                 processtype = "PA-RISC 7100 "
               Case 160
                 processtype = "V30 Family "
               Case 176
                 processtype = "Pentium III Xeon "
               Case 177
                 processtype = "Pentium III Processor with Intel SpeedStep Technology "
               Case 178
                 processtype = "Pentium 4 "
               Case 179
                 processtype = "Intel Xeon "
               Case 180
                 processtype = "AS400 Family "
               Case 181
                 processtype = "Intel Xeon processor MP "
               Case 182
                 processtype = "AMD AthlonXP Family "
               Case 183
                 processtype = "AMD AthlonMP Family "
               Case 184
                 processtype = "Intel Itanium 2 "
               Case 185
                 processtype = "AMD Opteron Family "
               Case 190
                 processtype = "K7 "
               Case 200
                 processtype = "IBM390 Family "
               Case 201
                 processtype = "G4 "
               Case 202
                 processtype = "G5 "
               Case 250
                 processtype = "i860 "
               Case 251
                 processtype = "i960 "
               Case 260
                 processtype = "SH-3 "
               Case 261
                 processtype = "SH-4 "
               Case 280
                 processtype = "ARM "
               Case 281
                 processtype = "StrongARM "
               Case 300
                 processtype = "6x86 "
               Case 301
                 processtype = "MediaGX "
               Case 302
                 processtype = "MII "
               Case 320
                 processtype = "WinChip "
               Case 350
                 processtype = "DSP "
               Case 500
                 processtype = "Video Processor "
             End Select
             ListBox1.Items.Add("Family: " & processtype)
           End Function
           Function CpuStat(ByVal CpuStNUM)
             Dim stat
             Select Case CpuStNUM
               Case 0
                 stat = "Unknown "
               Case 1
                 stat = "CPU Enabled "
               Case 2
                 stat = "CPU Disabled by User via BIOS Setup "
               Case 3
                 stat = "CPU Disabled By BIOS (POST Error) "
               Case 4
                 stat = "CPU is Idle "
               Case 5
                 stat = "Reserved "
               Case 6
                 stat = "Reserved "
               Case 7
                 stat = "Other "
             End Select
             ListBox1.Items.Add("CpuStatus: " & stat)
           End Function
           Function processortype(ByVal proctypenum)
             Dim proctype
             Select Case proctypenum
               Case 1
                 proctype = "Other "
               Case 2
                 proctype = "Unknown "
               Case 3
                 proctype = "Central Processor "
               Case 4
                 proctype = "Math Processor "
               Case 5
                 proctype = "DSP Processor "
               Case 6
                 proctype = "Video Processor "
             End Select
             ListBox1.Items.Add("Processor Type: " & proctype)
           End Function
           End Class

           
           得到CD-ROM信息
           
           
              本文相关代码如下:
Imports System.Management
           Public Class Form1
             Inherits System.Windows.Forms.Form
           #Region " Windows 窗体设计器生成的代码 "
           Public Sub New()
             MyBase.New()
             '该调用是 Windows 窗体设计器所必需的。
             InitializeComponent()
             '在 InitializeComponent() 调用之后添加任何初始化
           End Sub
           '窗体重写 dispose 以清理组件列表。
           Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
             If disposing Then
               If Not (components Is Nothing) Then
                 components.Dispose()
               End If
             End If
             MyBase.Dispose(disposing)
           End Sub
           'Windows 窗体设计器所必需的
           '注意: 以下过程是 Windows 窗体设计器所必需的
           '可以使用 Windows 窗体设计器修改此过程。
           '不要使用代码编辑器修改它。
           Private components As System.ComponentModel.IContainer
           Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
           <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
             Me.ListBox1 = New System.Windows.Forms.ListBox
             Me.SuspendLayout()
             '
             'ListBox1
             '
             Me.ListBox1.Location = New System.Drawing.Point(24, 16)
             Me.ListBox1.Name = "ListBox1"
             Me.ListBox1.Size = New System.Drawing.Size(416, 173)
             Me.ListBox1.TabIndex = 0
             '
             'Form1
             '
             Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
             Me.ClientSize = New System.Drawing.Size(456, 206)
             Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.ListBox1})
             Me.Name = "Form1"
             Me.Text = "Form1"
             Me.ResumeLayout(False)
           End Sub
           #End Region
           Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
               Handles MyBase.Load
             On Error Resume Next
             Dim SoundDeviceQuery As New SelectQuery("Win32_CDROMDrive")
             Dim SoundDeviceSearch As New ManagementObjectSearcher(SoundDeviceQuery)
             Dim SoundDeviceInfo As ManagementObject
             For Each SoundDeviceInfo In SoundDeviceSearch.Get()
               Dim SizeInMBs As Long = (Val(SoundDeviceInfo("Size").ToString()))
               SizeInMBs = Int((SizeInMBs / (1024 * 1024)))
               ListBox1.Items.Add("CD-Rom Description: " & SoundDeviceInfo("caption").ToString())
               ListBox1.Items.Add("CD-Rom Manufacturer: " & SoundDeviceInfo("Manufacturer").ToString())
               ListBox1.Items.Add("CD-Rom Drive: " & SoundDeviceInfo("drive").ToString())
               ListBox1.Items.Add("CD-Rom Media Loaded: " & SoundDeviceInfo("MediaLoaded").ToString())
               ListBox1.Items.Add("CD-Rom Media Type: " & SoundDeviceInfo("MediaType").ToString())
               ListBox1.Items.Add("CD-Rom Volume Name: " & SoundDeviceInfo("VolumeName").ToString())
               ListBox1.Items.Add("CD-Rom Size: " & SizeInMBs & " MBytes")
               ListBox1.Items.Add("CD-Rom Status: " & SoundDeviceInfo("Status").ToString())
               ListBox1.Items.Add("CD-Rom MaxMediaSize: " & SoundDeviceInfo("MaxMediaSize").ToString())
               ListBox1.Items.Add("CD-Rom Id: " & SoundDeviceInfo("Id").ToString())
               ListBox1.Items.Add("CD-Rom TransferRate: "+Int(SoundDeviceInfo("TransferRate").ToString())+" KBs/秒")
             Next
           End Sub
           End Class

           
           得到硬盘信息
           
           
              本文相关代码如下:
Imports System.Management
           Public Class Form1
             Inherits System.Windows.Forms.Form
           #Region " Windows Form Designer generated code "
           Public Sub New()
             MyBase.New()
             InitializeComponent()
           End Sub
           Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
             If disposing Then
               If Not (components Is Nothing) Then
                 components.Dispose()
               End If
             End If
             MyBase.Dispose(disposing)
           End Sub
           Private components As System.ComponentModel.IContainer
           Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
           <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
             Me.ListBox1 = New System.Windows.Forms.ListBox
             Me.SuspendLayout()
             '
             'ListBox1
             '
             Me.ListBox1.Location = New System.Drawing.Point(8, 8)
             Me.ListBox1.Name = "ListBox1"
             Me.ListBox1.Size = New System.Drawing.Size(272, 212)
             Me.ListBox1.TabIndex = 0
             '
             'Form1
             '
             Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
             Me.ClientSize = New System.Drawing.Size(292, 238)
             Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.ListBox1})
             Me.Name = "Form1"
             Me.Text = "Form1"
             Me.ResumeLayout(False)
           End Sub
           #End Region
           Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
             On Error Resume Next
             Dim HDDDeviceQuery As New SelectQuery("Win32_DiskDrive")
             Dim HDDDeviceSearch As New ManagementObjectSearcher(HDDDeviceQuery)
             Dim HDDDeviceInfo As ManagementObject
             For Each HDDDeviceInfo In HDDDeviceSearch.Get()
               ListBox1.Items.Add("HDD Description: " & HDDDeviceInfo("caption").ToString())
               ListBox1.Items.Add("HDD BytesPerSector: " & HDDDeviceInfo("BytesPerSector").ToString())
               ListBox1.Items.Add("HDD CompressionMethod: " & HDDDeviceInfo("CompressionMethod").ToString())
               ListBox1.Items.Add("HDD Index: " & HDDDeviceInfo("Index").ToString())
               ListBox1.Items.Add("HDD InstallDate: " & HDDDeviceInfo("InstallDate").ToString())
               ListBox1.Items.Add("HDD Manufacturer: " & HDDDeviceInfo("Manufacturer").ToString())
               ListBox1.Items.Add("HDD Partitions: " & HDDDeviceInfo("Partitions").ToString())
               ListBox1.Items.Add("HDD Size: " & Int(Val(HDDDeviceInfo("Size").ToString()) / 2 ^ 30) & "  GBytes")
               ListBox1.Items.Add("HDD TotalCylinders: " & HDDDeviceInfo("TotalCylinders").ToString())
               ListBox1.Items.Add("HDD TotalSectors: " & HDDDeviceInfo("TotalSectors").ToString())
               ListBox1.Items.Add("HDD TracksPerCylinder: " & HDDDeviceInfo("TracksPerCylinder").ToString())
               ListBox1.Items.Add("HDD TotalHeads: " & HDDDeviceInfo("TotalHeads").ToString())
               ListBox1.Items.Add("HDD TotalTracks: " & HDDDeviceInfo("TotalTracks").ToString())
               ListBox1.Items.Add("HDD SectorsPerTrack: " & HDDDeviceInfo("SectorsPerTrack").ToString())
               ListBox1.Items.Add("HDD SCSILogicalUnit: " & HDDDeviceInfo("SCSILogicalUnit").ToString())
             Next
           End Sub
           End Class

           
           得到声卡信息
           
           
              本文相关代码如下:
Imports System.Management
           Public Class Form1
             Inherits System.Windows.Forms.Form
           #Region " Windows Form Designer generated code "
           Public Sub New()
             MyBase.New()
             InitializeComponent()
           End Sub
           Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
             If disposing Then
               If Not (components Is Nothing) Then
                 components.Dispose()
               End If
             End If
             MyBase.Dispose(disposing)
           End Sub
           Private components As System.ComponentModel.IContainer
           Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
           <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
             Me.ListBox1 = New System.Windows.Forms.ListBox
             Me.SuspendLayout()
             '
             'ListBox1
             '
             Me.ListBox1.Location = New System.Drawing.Point(8, 8)
             Me.ListBox1.Name = "ListBox1"
             Me.ListBox1.Size = New System.Drawing.Size(272, 212)
             Me.ListBox1.TabIndex = 0
             '
             'Form1
             '
             Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
             Me.ClientSize = New System.Drawing.Size(292, 238)
             Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.ListBox1})
             Me.Name = "Form1"
             Me.Text = "Form1"
             Me.ResumeLayout(False)
           End Sub
           #End Region
           Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
             Dim SoundDeviceQuery As New SelectQuery("Win32_SoundDevice")
             Dim SoundDeviceSearch As New ManagementObjectSearcher(SoundDeviceQuery)
             Dim SoundDeviceInfo As ManagementObject
             For Each SoundDeviceInfo In SoundDeviceSearch.Get()
               ListBox1.Items.Add("Sound Device Description: " & SoundDeviceInfo("Caption").ToString())
               ListBox1.Items.Add("Sound Device Status: " & SoundDeviceInfo("status").ToString())
               ListBox1.Items.Add("Sound Device Manufacturer: " & SoundDeviceInfo("Manufacturer").ToString())
             Next
           End Sub
           End Class
 
            

 

本文地址:http://financialos.cn/?id=51
免责声明:本文为原创文章,版权归 jinesc 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?