从vb6加载dll时未找到文件

从vb6加载dll时未找到文件,vb6,interop,dll,Vb6,Interop,Dll,我在VB6中使用以下语法声明和调用dll函数: 'Declare the function Private Declare Sub MYFUNC Lib "mylib.dll" () 'Call the function MYFUNC 调用该函数会导致错误未找到文件:mylib.dll。当应用程序从vb6 IDE或已编译的可执行文件运行时,会发生这种情况 dll在工作目录中,我已经检查过它是使用sysinternals中的ProcMon.exe找到的。没有失败的加载,但未加载英特尔Fortr

我在VB6中使用以下语法声明和调用dll函数:

'Declare the function
Private Declare Sub MYFUNC Lib "mylib.dll" ()

'Call the function
MYFUNC
调用该函数会导致错误
未找到文件:mylib.dll
。当应用程序从vb6 IDE或已编译的可执行文件运行时,会发生这种情况

dll在工作目录中,我已经检查过它是使用sysinternals中的ProcMon.exe找到的。没有失败的加载,但未加载英特尔Fortran DLL(ProcMon跟踪在此之前似乎已停止)

我还尝试过在WinDbg.exe中运行该应用程序,奇怪的是,它居然可以运行!这条线上没有故障。ProcMon跟踪显示,以这种方式运行程序时,会加载英特尔Fortran DLL

dll是用Fortran Composer XE 2011编译的


有人能提供帮助吗?

我的第一个解决这个问题的标准方法是破解ProcMon(或XP上的FileMon)。设置过滤器,以便您可以看到它搜索文件的确切位置。它可能正在其他地方查找该文件或查找其他文件名。

该.dll必须位于当前的“工作”目录中(或已注册),否则在运行时应用程序无法找到它

做:

MsgBox“当前目录为”&CurDir

然后将其与您所期望的进行比较。.dll必须位于该目录中。

加载dll时,“找不到文件”通常会产生误导。这可能意味着DLL或它所依赖的文件丢失了——但如果是这样,您可能已经发现了Process Monitor的问题

通常,“未找到文件”消息实际上意味着找到了DLL,但加载或调用该方法时出错

在DLL中调用过程实际上有三个步骤:

  • 找到并加载DLL,运行DllMain方法(如果存在)
  • 在DLL中找到该过程
  • 调用程序
  • 这些阶段中的任何一个都可能发生错误。VB6在幕后执行所有这些操作,因此您无法知道错误发生在何处。但是,您可以使用Windows API函数控制进程。这将告诉您错误发生的位置。您还可以设置断点并使用进程监视器检查程序在每个点的行为,这可能会给您提供更多的见解

    下面的代码显示了如何使用Windows API调用DLL过程。要运行它,请将代码放入一个新模块,并将项目的启动对象设置为“Sub-Main”


    我尝试了@roomaroo的答案,但没有给我足够的具体信息。使用帮助我解决了这个问题。根据@bnadolson的说法,还必须进行chdir

    私有声明子MYFUNC库“mylib.dll”()

    首先,您要声明的是一个子函数,而不是一个函数。 这些没有返回值:

    (vb6) Sub() == (vc++) void Sub()
    (vb6) Func() as string == (vc++) string Func()
    
    您声明的路径是运行环境的本地路径。因此,在使用VB6.exe运行is debug模式时,需要将mylib.dll与VB6.exe放在同一目录中

    当您使用私有声明时,您可能需要考虑DLL的包装类。这允许您将公共dll访问分组在一起,但允许重用。然后使用类的方法访问公开的函数

    因此,您可以使用上面提供的所有代码,将其复制到类中

    MyClass代码:

    Option Explicit
    
    'Private Declare Sub MYFUNC Lib "mylib.dll" ()
    '<all code above Main()>
    
    Private Sub Class_Initialize()
        'initialise objects
    End Sub
    
    Private Sub Class_Terminate()
        'Set anyObj = Nothing
    End Sub
    
    Public Sub ClassMethod()
        On Error Goto errClassMethod
        'Perhaps look at refactoring the use of msgbox
    
        '<code body from Main() given above>
    
        exit sub
    errClassMethod:
        'handle any errors
    End Sub
    
    '<all code below main>
    

    正如我所解释的,dll是加载的(我可以通过ProcMon看到),但是它随后神秘地被卸载,vb6返回错误。
    Option Explicit
    
    'Private Declare Sub MYFUNC Lib "mylib.dll" ()
    '<all code above Main()>
    
    Private Sub Class_Initialize()
        'initialise objects
    End Sub
    
    Private Sub Class_Terminate()
        'Set anyObj = Nothing
    End Sub
    
    Public Sub ClassMethod()
        On Error Goto errClassMethod
        'Perhaps look at refactoring the use of msgbox
    
        '<code body from Main() given above>
    
        exit sub
    errClassMethod:
        'handle any errors
    End Sub
    
    '<all code below main>
    
    Sub Main()
        Dim m_base As MyClass
        Set m_base = New MyClass
        MyClass.ClassMethod()
    End Sub