Public Declare Function GetVolumeInformation& Lib "KERNEL32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal pVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long)
Public Const MAX_FILENAME_LEN = 256
 Function DriveSerial(ByVal sDrv As String) As Long
    Dim RetVal As Long
    Dim str As String * MAX_FILENAME_LEN
    Dim str2 As String * MAX_FILENAME_LEN
    Dim a As Long
    Dim b As Long
    Call GetVolumeInformation(sDrv & ":\", str, MAX_FILENAME_LEN, RetVal, a, b, str2, MAX_FILENAME_LEN)
    DriveSerial = RetVal
End Function'以上程序取出的是一长整型如82637297 有时还是负数? 是不是因为lpVolumeSerialNumber As Long 被定义为长整?
'API函数的定义中,这个应该是一地址!当WIN2K非法关机后,第二次启动会进行各个分区的扫描,在扫描的过程中也显示了各个分区的VolumeSerialNumber 但并不是以上程序取出的长整型,而是一字符串如:PH35-5H96????

解决方案 »

  1.   

    可以把lpVolumeSerialNumber定义成Currency,把返回值乘以10000即可,至于字符串是16进制的,用Hex即可转换
      

  2.   

    可能没有必要,就算是负数用Hex()应该也可以。我的硬盘序号不是负数,不能帮你确定,但正数的情况就是这样。转换后就是那个十六进制的了。
      

  3.   

    vb里面如果你取得是负数,你加上2^32就对了,然后hex就行了。