扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
用API 函数GetVolumeInformation得到的不是硬盘的序列号!!!
成都创新互联是一家从事企业网站建设、成都做网站、成都网站建设、成都外贸网站建设、行业门户网站建设、网页设计制作的专业网站设计公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点成百上千。
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize
);
看看英文啊:VolumeSerialNumber!得到的只是卷区序列号!
硬盘的序列号应该是
Drive Model Number________________: WDC WD400EB-00CPF0
Drive Serial Number_______________: WD-WCAATF083586
Drive Controller Revision Number__: 06.04G06
Controller Buffer Size on Drive___: 2097152 bytes
Drive Type________________________: Fixed
Drive Size________________________: 40020664320 bytes
中:
Drive Serial Number_______________: WD-WCAATF083586 这才是硬盘Serial Number!!!!
这个号是不会因为你格式化硬盘而改动,也不是网上流传的修改工具能改的,(其实网上流传的修改工具的也不过是卷区号而已!)
建议用 DiskID.dll或DiskID32.dll来获取
用diskid.dll和disk32.dll获得硬盘序列号
1.调用diskid.dll实现:
Option Explicit
Private Declare Function IsWinNT Lib "DiskID.DLL" () As Long
Private Declare Function ReadPhysicalDrive9X Lib "DiskID.DLL" (driveID As Long, buffer As Long, bufLen As Long) As Long
Private Declare Function ReadPhysicalDriveInNT Lib "DiskID.DLL" (driveID As Long, buffer As Long, bufLen As Long) As Long
Private Type DRIVER_INFO_OK
ModalNumber(39) As Byte
SerialNumber(19) As Byte
ControlNum(7) As Byte
DriveType As Long
Cylinders As Long
Heads As Long
Sectors As Long
End Type
Private Sub Command1_Click()
Dim x As DRIVER_INFO_OK
Dim i As Long
If IsWinNT = 1 Then
i = ReadPhysicalDriveInNT(ByVal 0, ByVal VarPtr(x), ByVal 256)
Else
i = ReadPhysicalDrive9X(ByVal 0, ByVal VarPtr(x), ByVal 256)
End If
Dim s As String
s = StrConv(x.ModalNumber, vbUnicode)
s = Left(s, InStr(1, s, Chr(0)) - 1)
MsgBox "硬件厂商代码为:" + s
s = StrConv(x.SerialNumber, vbUnicode)
s = Left(s, InStr(1, s, Chr(0)) - 1)
MsgBox "硬盘序列号为:" + s
End Sub
2.调用diskid32.dll实现:
Option Explicit
Private Declare Function DiskID32 Lib "DiskID32.DLL" (ByRef DiskModel As Byte, ByRef DiskID As Byte) As Long
Private Sub Command1_Click()
Dim DiskModel(31) As Byte, DiskID(31) As Byte, i As Integer, Model As String, ID As String
If DiskID32(DiskModel(0), DiskID(0)) 1 Then
MsgBox "get diskid32 err"
Exit Sub
End If
For i = 0 To 31
If Chr(DiskModel(i)) Chr(0) Then
Model = Model Chr(DiskModel(i))
End If
If Chr(DiskID(i)) Chr(0) Then
ID = ID Chr(DiskID(i))
End If
Next
MsgBox "硬件产生代码为:" + Model
MsgBox "硬盘序列号为:" + ID
End Sub
说明:diskid.dll可从下载
diskid32.dll可从下载
cnum 没有声明dim的声明一下,
你必须明白,如果你用 vb.net 做开发就别再用 ado 而改用ado.net
用oledb.oldbconnection代替 adodb.connection
如果你坚持在 .net 中用ado,请添加引用,引用 com 中的 ado
setfocus 不是.net 用法 改成 focus
unload改成 close
或者你可以用vb.net 的自带工具,升级vb6的代码。
窗体上不存在 Text1 这个控件,所以出错。
通常文本框控件在VB6中默认是Text1,而在VB.NET中则是TextBox1,是不是这个错误?如果是,那么你可以把代码中的全部Text1改为TextBox1,或者把文本框控件的名称改为Text1也行。
MessageBox因该是一个控件的名称,你一个空白页面,什么控件都没,当然无法引用。
随便拉一个控件出来,然后属性名称设置为MessageBox就可以了。
返回的Variant(长),指定一个字符串在另一个字符串在第一的位置。
语法
INSTR([开始]字符串1,字符串[比较])
InStr函数的语法有以下参数:
部分
启动可选参数。数值表达式,设置每次搜索的起点。如果从第一个字符的位置被删去。如果start包含Null,将发生错误。如果指定了compare参数,你必须有一个起始参数。
string1中所需的参数。接受搜索字符串表达式。
字符串所需的参数。搜索的字符串表达式。
比较可选参数。指定的字符串比较。如果比较是空的,就会发生错误。如果省略比较选项比较设置决定比较的类型。
集
比较参数设置:
恒定值说明
vbUseCompareOption -1用Option Compare语句设置为执行的比较。的执行0
描述vbBinaryCompare 0二进制比较。 / vbTextCompare 1进行比较,根据原来的。
vbDatabaseCompare 2仅适用于Microsoft Access中,根据数据库中的信息进行比较。
返回值
如果InStr返回
string1是零长度0
STRING1为Null空
字符串长度为零开始字符串是空空
字符串找不到
在string1中找到string2中找到位置
开始字符串0
描述
INSTRB功能作用于在字符串中包含的数据字节。因此INSTRB返回的字节位置,而不是字符位置。
INSTR函数示例
本示例使用InStr函数来找到一个字符串在另一个字符串中第一次出现的。
暗淡的searchstring SearchChar MyPos
搜寻字串=“XXpXXpXXPXXP”'被搜索的字符串。该,
SearchChar =“P”'要查找字符串“P”。
“从一开始的第四个字符,文本比较看。返回值是6(小写对)。
'小写p,大写的P在文字下是相同的。
MyPos = INSTR(4,搜寻字串,SearchChar 1),
“开放二进制比较从第一个字符找到。 9(大写P)的返回值。
'小写p和大写的P在二进制比较是不一样的。在,
MyPos = INSTR(1搜寻字串,SearchChar 0)
的默认,而不是二进制比较(最后一个参数可省略)。
MyPos = INSTR(搜寻字串SearchChar),返回到9。
MyPos = INSTR(1,搜寻字串,“W”)'返回0。
关于鹿养生的知识非常乐意与您分享
猜想你使用时是用类名.方法名?
改成(new 类名()).方法名试试。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流