下面的程序是某位大虾编的,运行后,vb提示“找不到dll入口GetlogicaldrivestringsA in kernel32”
  本人试着在system32下找到kernel32.dll,并使用regsvc32.exe kernel32.dll来注册kernel32.dll,系统提示已经加载kernel32.dll,但并未找到dllregisterserver输入点。
不知道为什么下述程序不能运行?是不是在vb主程序里要设置什么东东?恳请各位大虾赐教,或帮忙再改改,一定给分。
Option Explicit
Private Declare Function GetDriveType Lib "kernel32 " Alias "GetDriveTypeA " (ByVal nDrive As String) As Long
Private Declare Function GetLogicalDriveStrings Lib "kernel32 " Alias "GetLogicalDriveStringsA " (ByVal nBufferLength As Long, ByVal lpBuffer As String) As LongPrivate Const DRIVE_REMOVABLE = 2
Private Const DRIVE_FIXED = 3
Private Const DRIVE_REMOTE = 4
Private Const DRIVE_CDROM = 5
Private Const DRIVE_RAMDISK = 6
Private Sub Command1_Click()
Dim rtn     As String
        Dim AllDrives     As String
        Dim JustOneDrive     As String
        AllDrives = Space$(64)                                ''设置缓冲
        rtn = GetLogicalDriveStrings(Len(AllDrives), AllDrives)         ''调用函数得到包含所有驱动器的字符串
        AllDrives = Left(AllDrives, rtn)
        Do
                rtn = InStr(AllDrives, Chr(0))
                If rtn Then                                                                
                        JustOneDrive = Left(AllDrives, rtn)
                        AllDrives = Mid(AllDrives, rtn + 1, Len(AllDrives))
                        rtn = GetDriveType(JustOneDrive)      '                '检查驱动器类型
                        Debug.Print rtn, JustOneDrive
                End If
        Loop Until AllDrives = " "
End Sub

解决方案 »

  1.   

    Option Explicit
    Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
    Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As LongPrivate Const DRIVE_REMOVABLE = 2
    Private Const DRIVE_FIXED = 3
    Private Const DRIVE_REMOTE = 4
    Private Const DRIVE_CDROM = 5
    Private Const DRIVE_RAMDISK = 6
    Private Sub Command1_Click()
    Dim rtn             As String
                    Dim AllDrives             As String
                    Dim JustOneDrive             As String
                    AllDrives = Space$(64)                                                                     ''设置缓冲
                    rtn = GetLogicalDriveStrings(Len(AllDrives), AllDrives)                         ''调用函数得到包含所有驱动器的字符串
                    AllDrives = Left(AllDrives, rtn)
                    Do
                                    rtn = InStr(AllDrives, Chr(0))
                                    If rtn Then
                                                    JustOneDrive = Left(AllDrives, rtn)
                                                    AllDrives = Mid(AllDrives, rtn + 1, Len(AllDrives))
                                                    rtn = GetDriveType(JustOneDrive)                 '                                 '检查驱动器类型
                                                    Debug.Print rtn, JustOneDrive
                                    End If
                    Loop Until AllDrives = ""
    End Sub
      

  2.   


    从csdn的论坛的缺陷来看,复制、粘贴一次代码,所有引号中多一个空格。而你的代码中引号里面多了两个空格,可想而知,你原来的代码中引号里就有一个空格,你的代码是不是从csdn中复制的?我想可能是一种原因吧!
    另一种可能就是你的电脑里的windows或其它的环境变量所指的目录中有一个名为kernel32.dll的文件,VB先找到它的了!而且叫这种名的非系统DLL,往往是病毒!
      

  3.   

    文件名要包括后缀,否则你这么保证找的是“kernel32.dll”而不是“kernel32.”
    Private Declare Function GetLogicalDriveStrings Lib "kernel32.dll" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
      

  4.   

    Tiger_Zhao 果然是vb老鸟,待会儿给你分
      

  5.   

    3楼的果然好眼力,是阿,是复制csdn上的,赫赫
      

  6.   

    问题解决了。
    四楼“kernel32.dll”而不是"kernel32."什么意思阿?能不能再解释清楚点。system32文件夹里,没有kernel32.呀,跟后缀名无关吧,只要是运行kernel32 就会自动指向kernel32.dll吧?
      

  7.   

    Tiger_Zhao 的意思是,假如system32文件夹里,有kernel32.这个文件,我们先不管他是如何产生的,VB程序有可能就去系统文件夹是找名为kernel32.*(因为声明时没有带扩展名)文件,但VB是不是会找扩展名不是dll的文件就不得而知了,也懒得去测试