从vb6加载dll时未找到文件
我在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
'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中调用过程实际上有三个步骤:
我尝试了@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