Visual Basic 6 检查 dll 是否存在

Visual Basic 6 check if dll exists

我需要一点帮助,如果检测到 test.dll(test.dll 只是一个示例)并且 dll 不存在,我正在尝试退出子程序,继续做代码中的其他事情。我正在尝试这样做,但是即使 dll 存在,sub 也不存在。你能告诉我哪里错了吗?有什么建议吗?我在下面留下一个例子。

Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Sub main()
    If GetModuleHandle("test.dll") = 1 Then
        Exit Sub
    Else
        Do other things
    End if
End sub

根据:[MS.Docs]: GetModuleHandleA function (libloaderapi.h)重点是我的):

Retrieves a module handle for the specified module. The module must have been loaded by the calling process.

所以:

  1. GetModuleHandle 不是正确的方法,因为 .dll 应该已经加载到它的进程中成功(并且它在磁盘上的存在无关紧要)

  2. 即使方法正确,条件(= 1)也不正确。函数 returns(正)处理值(这样的值是 1 的可能性非常小),或者 NULL (0) 如果未加载 .dll

例如 [VBForums]: Classic VB - How can I check if a file exists? 有很多变体,以第 1st(也是最简单的)一个为例:

If Dir("test.dll") <> "" Then
    Exit sub

注意,.dll 路径很重要!!!

传统上,文件存在性检查是通过查询文件系统的文件属性来完成的。

Option Explicit

Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long

Private Sub Form_Load()
    If FileExists("test.dll") Then
        MsgBox "DLL exists", vbExclamation
    Else
        '--- do other things
    End If
End Sub

Public Function FileExists(sFile As String) As Boolean
    If GetFileAttributes(sFile) = -1 Then ' INVALID_FILE_ATTRIBUTES
        FileExists = (Err.LastDllError = 32) ' ERROR_SHARING_VIOLATION
    Else
        FileExists = True
    End If
End Function

访问属性(曾经)在各种网络提供商中进行了优化,因此这在网络共享上表现非常好。

使用 Dir 检查文件是否存在可能会扰乱您当前的目录枚举过程。通常 Dir VB6 运行时中的函数是使用全局状态进行本地操作的一个非常糟糕的例子——从来都不是一个好的设计模式。