下面是我在论坛上搜索到的VB下调用DiskID.dll 的代码,可在win98下运行时,老提示找不到切入口.在win2000/xp下没问题.请大家看一下,是什么原因?Option Explicit
'******************************************************************
'这是和 DiskID.DLL 配合使用来取硬盘的物理序列号的模块。
'******************************************************************Private Declare Function IsWinNT Lib "DiskID.DLL" () As LongPrivate Declare Function ReadPhysicalDrive9X Lib "DiskID.DLL" _
(ByVal driveID As Long, ByVal lpBuffer As Long, ByVal bufLen As Long) As Long
Private Declare Function ReadPhysicalDriveInNT Lib "DiskID.DLL" _
(ByVal driveID As Long, ByVal lpBuffer As Long, ByVal bufLen As Long) As LongPrivate 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 TypePublic Function GetDiskID_Demo()
'获取硬盘信息的演示程序。 Dim x As DRIVER_INFO_OK
Dim i As Long
If IsWinNT = 1 Then
i = ReadPhysicalDriveInNT(ByVal 0&, ByVal VarPtr(x), LenB(x))
Else
i = ReadPhysicalDrive9X(ByVal 0&, ByVal VarPtr(x), LenB(x))
End If
MsgBox "BufLen:" & LenB(x) Dim s As String
s = StrConv(x.ModalNumber, vbUnicode)
s = Left(s, InStr(1, s, ChrW(0)) - 1)
MsgBox "硬件厂商代码为:" + s
s = StrConv(x.SerialNumber, vbUnicode)
s = Left(s, InStr(1, s, ChrW(0)) - 1)
MsgBox "硬盘序列号为:" + s
End Function
'******************************************************************
'这是和 DiskID.DLL 配合使用来取硬盘的物理序列号的模块。
'******************************************************************Private Declare Function IsWinNT Lib "DiskID.DLL" () As LongPrivate Declare Function ReadPhysicalDrive9X Lib "DiskID.DLL" _
(ByVal driveID As Long, ByVal lpBuffer As Long, ByVal bufLen As Long) As Long
Private Declare Function ReadPhysicalDriveInNT Lib "DiskID.DLL" _
(ByVal driveID As Long, ByVal lpBuffer As Long, ByVal bufLen As Long) As LongPrivate 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 TypePublic Function GetDiskID_Demo()
'获取硬盘信息的演示程序。 Dim x As DRIVER_INFO_OK
Dim i As Long
If IsWinNT = 1 Then
i = ReadPhysicalDriveInNT(ByVal 0&, ByVal VarPtr(x), LenB(x))
Else
i = ReadPhysicalDrive9X(ByVal 0&, ByVal VarPtr(x), LenB(x))
End If
MsgBox "BufLen:" & LenB(x) Dim s As String
s = StrConv(x.ModalNumber, vbUnicode)
s = Left(s, InStr(1, s, ChrW(0)) - 1)
MsgBox "硬件厂商代码为:" + s
s = StrConv(x.SerialNumber, vbUnicode)
s = Left(s, InStr(1, s, ChrW(0)) - 1)
MsgBox "硬盘序列号为:" + s
End Function
If IsWinNT = 1 Then
i = ReadPhysicalDriveInNT(ByVal 0&, ByVal VarPtr(x), LenB(x))
Else
i = ReadPhysicalDrive9X(ByVal 0&, ByVal VarPtr(x), LenB(x))
End If改成:i = ReadPhysicalDrive9X(ByVal 0&, ByVal VarPtr(x), LenB(x))
只用这一句试试呢?
Private Declare Function ReadPhysicalDrive9X Lib "DiskID.DLL" _
Alias "ReadDrivePortsInWin9X" (driveID As Long, buffer As Long, _
bufLen As Long) As Long
Private Declare Function DiskID32 Lib "DiskID32.DLL" (ByRef DiskModel As Byte, ByRef DiskID As Byte) As LongFunction Xuliehao() As String '取得第一IDE硬盘物理ID
Dim DiskModel(31) As Byte, DiskID(31) As Byte, i As Integer, Model As String, Id As String, xuliehao As String
On Error Resume Next
If DiskID32(DiskModel(0), DiskID(0)) <> 1 Then
Sleep 1000
If DiskID32(DiskModel(0), DiskID(0)) <> 1 Then'二次重试
MsgBox "无法识别硬盘ID"
End If
End If
'取ID
xuliehao = "": Id = ""
For i = 0 To 31
If Chr(DiskModel(i)) <> Chr(0) Then Model = Model & Chr(DiskModel(i))
If Chr(DiskID(i)) <> Chr(0) Then Id = Id & Chr(DiskID(i))
Next
Xuliehao = Trim(ID)
End Function==========================================================
以上是我用DISKID32.DLL取硬盘物理ID的代码,在98/Me/2000/XP/2003下100%全部都通过的代码,只要硬盘(必须接在第一IDE接口是IDE硬盘),保证取得出ID。你用的DISKID.DLL不知道版本,可能版本太低,我用的是2.00版,我的共享软件用的就是这个,还是免费的,你需要我可给你压缩包——不过你分好像少了点,我得考虑值不值得。
这种取ID的方法要的第一就是安全稳定,网上这类东西是有一些,不过我就喜欢用这相,软件工作两年了从没出过问题。
想直接用VB代码或API实现取物理ID,如果不挂靠.VXD帮助是根本实现不了的,都知道VB没有直接操作底层硬件的功能,chewinggum的方法我也感兴趣,不知可否交流一下。
可否给我一份代码?
或者分开几次贴出来大家共享。[email protected]
谢谢!
已收到,再次谢谢!