下面是我在论坛上搜索到的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

解决方案 »

  1.   

    是否没有注册Disk.dll,把它放到System文件夹里面呢?没在98下面用过,帮不到你
      

  2.   

    既然需要Declare来声明, 也就意味着这个DiskID.DLL不是一个ActiveX DLL, 所以它是不需要也不能注册的。如果可以注册的话,你根本不需要用Declare来声明函数原型,只需要直接引用这个ActiveX DLL库就行了。“找不到入口”可能是: 1. 这个DLL文件已经损坏;2. 你的声明中的函数名的字母大小写有问题;3. 这个DLL文件中根本没有你所申明的函数。
      

  3.   

    我Win2000/XP下面都用过这个DLL,我想既然确定是98,那么把这个:
    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))
    只用这一句试试呢?
      

  4.   

    98下用这个DLL确实是有问题,想其他办法吧
      

  5.   

    在98下如下声明可也。
    Private Declare Function ReadPhysicalDrive9X Lib "DiskID.DLL" _
        Alias "ReadDrivePortsInWin9X" (driveID As Long, buffer As Long, _
        bufLen As Long) As Long
      

  6.   

    '取得第一IDE硬盘物理ID号用
    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版,我的共享软件用的就是这个,还是免费的,你需要我可给你压缩包——不过你分好像少了点,我得考虑值不值得。
      

  7.   

    倒,怎么那么没有共享精神啊.LZ,我这里有一个用VB实现的取得硬盘物理ID的代码,你可以参考一下:http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=367&page=1
      

  8.   

    楼上做人不厚道,助人为快乐之本居然在这里讨价还价!我这里有一个完全用VB代码实现的获取硬盘ID的代码,直接调用API DeviceIoControl()来获取硬盘信息的VB程序,如果楼主想要可以和我QQ联系:71429660
      

  9.   

    倒!不要就算了,算我没说,其实我每天都回答好多问题,说我倒的就这二位。
    这种取ID的方法要的第一就是安全稳定,网上这类东西是有一些,不过我就喜欢用这相,软件工作两年了从没出过问题。
    想直接用VB代码或API实现取物理ID,如果不挂靠.VXD帮助是根本实现不了的,都知道VB没有直接操作底层硬件的功能,chewinggum的方法我也感兴趣,不知可否交流一下。
      

  10.   

    楼上,代码太长帖不上来。直接和我QQ联系。vxd是9x下的产物,你的vxd在2000下能正常吗?如果想同时支持多个系统还是需要下一番功夫的。VB的确不能直接操作底层硬件,在ring3的条件下就算VC也没法直接碰硬件。windows实际上已经提供了一些操作底层的API,只不过你还不熟悉罢了。我的观点是能不调用别人写的没有任何源代码的dll尽量不调用,万一出了问题连解决问题的办法都没有。举个最简单的例子:你自己也说了你的DISKID32.DLL 2.0只能取第一IDE接口的IDE硬盘,依靠于那个dll你也没办法读出其它几个IDE口上的硬盘ID吧。做人要谦虚!
      

  11.   

    楼上(口香糖):
    可否给我一份代码?
    或者分开几次贴出来大家共享。[email protected]
    谢谢!
      

  12.   

    我认错,批评够了吗?哈哈哈!不知道大师的代码复杂到什么程度,在98下真的不需要任何挂靠就用API能解决吗?那样代码肯定非常复杂,不可能用三二十行解决吧。我没研究过DeviceIoControl到底适用什么操作系统(不过微软的权威文件说在98下好像真得用VXD帮助),不过直接用在98下肯定不行。如果我说错了请原谅,仅代表个人小见不要再说不谦虚了。
      

  13.   

    不调用api的确是不行,你问问写C的,他们不调API能不能做到,NT环境ring3下用内嵌汇编也做不到。我的代码98下面的确是要调vxd,但是微软已经提供了,不需要使用第三方。另外98下是可以直接访问硬件端口的,如果你在VB里面嵌套汇编并且熟悉相关的port指令不需要vxd你也能得到硬盘ID。不想再讨论这个问题了,有兴趣跟我联系给你代码就是了。
      

  14.   

    chewinggum(口香糖) 谢谢你的指导,如果不介意我想要你代码,我的EMAIL是[email protected]
      

  15.   

    chewinggum(口香糖):
    已收到,再次谢谢!