VB中怎样根据动态传入的dll的名称调用dll

niccctvcom 2007-07-04 11:08:05
dll是在DEV-C++下开发的;
在实际应用中有很多的dll,名称不同,但接口函数相同;
dll的名称通过参数传递给VB程序进行调用。

由于对VB不熟悉,不知道这样的调用能否实现?
如果能实现,请给些实际代码,谢谢。
...全文
252 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
IORI915189 2007-07-04
  • 打赏
  • 举报
回复

参数一(pFn ):函数指针
参数二(pParam ):参数指针,指向一个连续的内存块,比如目的函数有三个参数,分别为A,B,C。你可以定义一个结构,结构体为A,B,C(每个参数均为4字节长),然后传这个结构的地址。
参数三(Count ):参数个数。
IORI915189 2007-07-04
  • 打赏
  • 举报
回复
很麻烦吧

Public Type Type
a As Long
b As Long
c As Long
End Type

Public Type Type1
a As Long
b As Long
End Type

窗体
Private Declare Function CallAsmCode Lib "user32" Alias "CallWindowProcA" (lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Function CallAnyFunc(ByVal pFn As Long, ByVal pParam As Long, ByVal Count As Long) As Long
Dim CallAnyFuncCode(34) As Long, lRet As Long
CallAnyFuncCode(0) = &H53EC8B55
CallAnyFuncCode(1) = &HE8&
CallAnyFuncCode(2) = &HEB815B00
CallAnyFuncCode(3) = &H1000112C
CallAnyFuncCode(4) = &H114A938D
CallAnyFuncCode(5) = &H64521000
CallAnyFuncCode(6) = &H35FF&
CallAnyFuncCode(7) = &H89640000
CallAnyFuncCode(8) = &H25&
CallAnyFuncCode(9) = &H8B1FEB00
CallAnyFuncCode(10) = &HE80C2444
CallAnyFuncCode(11) = &H0&
CallAnyFuncCode(12) = &H53E98159
CallAnyFuncCode(13) = &H8D100011
CallAnyFuncCode(14) = &H119791
CallAnyFuncCode(15) = &HB8908910
CallAnyFuncCode(16) = &H33000000
CallAnyFuncCode(17) = &H558BC3C0
CallAnyFuncCode(18) = &H104D8B0C
CallAnyFuncCode(19) = &HEB8A148D
CallAnyFuncCode(20) = &HFC528D06
CallAnyFuncCode(21) = &HB4932FF
CallAnyFuncCode(22) = &H8BF675C9
CallAnyFuncCode(23) = &HD0FF0845
CallAnyFuncCode(24) = &H58F64
CallAnyFuncCode(25) = &H83000000
CallAnyFuncCode(26) = &H4D8B04C4
CallAnyFuncCode(27) = &H5B018914
CallAnyFuncCode(28) = &H10C2C9
CallAnyFuncCode(29) = &H58F64
CallAnyFuncCode(30) = &H83000000
CallAnyFuncCode(31) = &HC03304C4
CallAnyFuncCode(32) = &H89144D8B
CallAnyFuncCode(33) = &HC2C95B21
CallAnyFuncCode(34) = &H90900010
CallAnyFunc = CallAsmCode(CallAnyFuncCode(0), pFn, pParam, Count, lRet)
If CallAnyFunc <> lRet Then
CallAnyFunc = 0 '这里表示出现严重错误,你应当再了解目的函数的使用方法
Debug.Assert False '因为你的参数传递问题,导致程序已出现了非法操作。
End If
End Function

Private Sub Form_Load()
Dim hModule As Long
Dim pFunc As Long

Dim a As Type
Dim b As Type1

a.a = 1'结束进程所需权限
a.b = 0
a.c = Shell("notepad.exe", vbMinimizedFocus) '记事本PID

hModule = GetModuleHandle("kernel32") '模块句柄


pFunc = GetProcAddress(hModule, "OpenProcess") 'OpenProcess入口地址
b.a = CallAnyFunc(pFunc, VarPtr(a), 3) '动态调用函数
b.b = 0

pFunc = GetProcAddress(hModule, "TerminateProcess")'TerminateProcess入口地址
CallAnyFunc pFunc, VarPtr(b), 2'动态调用函数

End Sub


也可以直接用CallWindowProcA 动态调用

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧