如何调用另一个DLL中的函数?(Win7/VB6.0)

如何调用另一个DLL中的函数?(Win7/VB6.0),dll,vb6,Dll,Vb6,我想从另一个DLL(假设这是“DLL_B”)调用DLL(假设这是“DLL_a”)中的函数(假设这是“foo”)。你能告诉我怎么做吗 我可以使用如下声明函数调用“DLL_A”中的“foo” 'standard module Declare Function foo Lib "Dll_A.dll" _ (ByRef val1 As Any, ByVal val2 As Long, _ ByVal val3 As Long, ByVal val4 As Long, _

我想从另一个DLL(假设这是“DLL_B”)调用DLL(假设这是“DLL_a”)中的函数(假设这是“foo”)。你能告诉我怎么做吗

我可以使用如下声明函数调用“DLL_A”中的“foo”

'standard module
    Declare Function foo Lib "Dll_A.dll" _
     (ByRef val1 As Any, ByVal val2 As Long, _
      ByVal val3 As Long, ByVal val4 As Long, _
     ByRef val5 As Any) As Long

'form
    return = foo(val1, val2, val3, val5, val6)
'/*******************************************************************
'/*     DLL_B
'/*******************************************************************
Private Function bar(val1 As Long, val2 As Long, val3 As Long, val4 As Long, val5 As L        ong)
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("Dll_A")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "foo")
'Call the SetWindowTextA-function
CallWindowProc pa, ByVal val1, ByVal val2, ByVal val3, ByVal val4, ByVal val5
'unmap the library's address
FreeLibrary lb
End Function
'/*******************************************************************
'/*     The code which I used as reference. 
'/*******************************************************************
Create a New project And add this code To Form1
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal     lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal     lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal   lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal   lParam As Any) As Long

Private Sub Form_Load()
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("user32")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "SetWindowTextA")
'Call the SetWindowTextA-function
CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
'unmap the library's address
FreeLibrary lb
End Sub
'standard module
Declare Function bar Lib "Dll_B.dll" _
(ByRef val1 As Any, ByVal val2 As Long, _
ByVal val3 As Long, ByVal val4 As Long, _
ByRef val5 As Any) As Long

'form
return = bar(val1, val2, val3, val4, val5)
然后,我使用VisualBasic6.0的ActiveX动态链接库制作了“Dll_B”。(我使用下面的代码作为参考。)“DLL_B”如下所示

'standard module
    Declare Function foo Lib "Dll_A.dll" _
     (ByRef val1 As Any, ByVal val2 As Long, _
      ByVal val3 As Long, ByVal val4 As Long, _
     ByRef val5 As Any) As Long

'form
    return = foo(val1, val2, val3, val5, val6)
'/*******************************************************************
'/*     DLL_B
'/*******************************************************************
Private Function bar(val1 As Long, val2 As Long, val3 As Long, val4 As Long, val5 As L        ong)
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("Dll_A")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "foo")
'Call the SetWindowTextA-function
CallWindowProc pa, ByVal val1, ByVal val2, ByVal val3, ByVal val4, ByVal val5
'unmap the library's address
FreeLibrary lb
End Function
'/*******************************************************************
'/*     The code which I used as reference. 
'/*******************************************************************
Create a New project And add this code To Form1
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal     lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal     lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal   lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal   lParam As Any) As Long

Private Sub Form_Load()
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("user32")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "SetWindowTextA")
'Call the SetWindowTextA-function
CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
'unmap the library's address
FreeLibrary lb
End Sub
'standard module
Declare Function bar Lib "Dll_B.dll" _
(ByRef val1 As Any, ByVal val2 As Long, _
ByVal val3 As Long, ByVal val4 As Long, _
ByRef val5 As Any) As Long

'form
return = bar(val1, val2, val3, val4, val5)
我用作参考的代码如下

'standard module
    Declare Function foo Lib "Dll_A.dll" _
     (ByRef val1 As Any, ByVal val2 As Long, _
      ByVal val3 As Long, ByVal val4 As Long, _
     ByRef val5 As Any) As Long

'form
    return = foo(val1, val2, val3, val5, val6)
'/*******************************************************************
'/*     DLL_B
'/*******************************************************************
Private Function bar(val1 As Long, val2 As Long, val3 As Long, val4 As Long, val5 As L        ong)
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("Dll_A")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "foo")
'Call the SetWindowTextA-function
CallWindowProc pa, ByVal val1, ByVal val2, ByVal val3, ByVal val4, ByVal val5
'unmap the library's address
FreeLibrary lb
End Function
'/*******************************************************************
'/*     The code which I used as reference. 
'/*******************************************************************
Create a New project And add this code To Form1
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal     lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal     lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal   lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal   lParam As Any) As Long

Private Sub Form_Load()
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("user32")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "SetWindowTextA")
'Call the SetWindowTextA-function
CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
'unmap the library's address
FreeLibrary lb
End Sub
'standard module
Declare Function bar Lib "Dll_B.dll" _
(ByRef val1 As Any, ByVal val2 As Long, _
ByVal val3 As Long, ByVal val4 As Long, _
ByRef val5 As Any) As Long

'form
return = bar(val1, val2, val3, val4, val5)
我使用declare函数调用“bar”,方法与“DLL_A”相同,如下所示

'standard module
    Declare Function foo Lib "Dll_A.dll" _
     (ByRef val1 As Any, ByVal val2 As Long, _
      ByVal val3 As Long, ByVal val4 As Long, _
     ByRef val5 As Any) As Long

'form
    return = foo(val1, val2, val3, val5, val6)
'/*******************************************************************
'/*     DLL_B
'/*******************************************************************
Private Function bar(val1 As Long, val2 As Long, val3 As Long, val4 As Long, val5 As L        ong)
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("Dll_A")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "foo")
'Call the SetWindowTextA-function
CallWindowProc pa, ByVal val1, ByVal val2, ByVal val3, ByVal val4, ByVal val5
'unmap the library's address
FreeLibrary lb
End Function
'/*******************************************************************
'/*     The code which I used as reference. 
'/*******************************************************************
Create a New project And add this code To Form1
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal     lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal     lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal   lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal   lParam As Any) As Long

Private Sub Form_Load()
On Error Resume Next
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("user32")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "SetWindowTextA")
'Call the SetWindowTextA-function
CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
'unmap the library's address
FreeLibrary lb
End Sub
'standard module
Declare Function bar Lib "Dll_B.dll" _
(ByRef val1 As Any, ByVal val2 As Long, _
ByVal val3 As Long, ByVal val4 As Long, _
ByRef val5 As Any) As Long

'form
return = bar(val1, val2, val3, val4, val5)
但我执行这段代码时,会显示以下错误

运行时错误“453”在“DLL_B”中找不到DLL入口点“bar”

我试图按如下方式调用“bar”,但也显示了错误

Dim objB As Object
set objB = CreateObject("Project1.Class1")
call objB.bar()
set objB = Nothing
在我向注册表注册“DLL_B”之后,错误仍然显示


请告诉我解决策略或给我一个线索

我很困惑…这两个DLL都是用VB6编写的吗?因为如果是,您可以使用VB6 IDE设置对dll的引用。不需要额外的编码。
bar
在这里不是定义为私有的吗?它不是那么简单。VB6仅导出COM(ActiveX)对象,但有一种方法可以截取链接器并修改其参数以创建stdcall导出函数。有一个名为vbAdvance(插件)的程序可以自动完成这项工作,但它的网站已经被删除并停止使用。在谷歌上搜索一下,就有机会找到它,还有解释详细过程的教程。