vb动态调用动态链接库
vb怎么动态调用动态链接库?如:启动时从ini文件中读dll的路径并调用其中的某一个函数并获取返回值。读写ini文件的API函数可以在编译时就确定,系统自动在运行时加载,...
vb怎么动态调用动态链接库?
如:启动时从ini文件中读dll的路径并调用其中的某一个函数并获取返回值。
读写ini文件的API函数可以在编译时就确定,系统自动在运行时加载,可以用Declare解决;
而在运行时才能读路径,不能在编译时就确定要加载的函数。
注:不要在编程时用Declare声明动态链接库的所有的函数。这个很简单,我也会,但是声明了许多没用的函数,很浪费系统资源,不是我想要的。
动态链接库都只能运行时加载,但是声明的时间不一样。 展开
如:启动时从ini文件中读dll的路径并调用其中的某一个函数并获取返回值。
读写ini文件的API函数可以在编译时就确定,系统自动在运行时加载,可以用Declare解决;
而在运行时才能读路径,不能在编译时就确定要加载的函数。
注:不要在编程时用Declare声明动态链接库的所有的函数。这个很简单,我也会,但是声明了许多没用的函数,很浪费系统资源,不是我想要的。
动态链接库都只能运行时加载,但是声明的时间不一样。 展开
3个回答
展开全部
关于你的问题,我有一些建议。
1、对于资源的浪费问题。动态加载实际上是已经存在的,一个Dll中可能包含很多的函数,而且Dll文件本身可能不大,几百兆的已经算是大文件了,对于现在的系统硬件来说,这些资源的开销应该不是太大的问题。当然,这里没有考虑到你究竟设计的是怎样的一个软件,所以姑且做这个假设。实际上如果Dll只在函数被用到时加载,不用时就卸载,效率本身就会受到影响。目前Dll都是加载后存在于内存中,直到程序关闭才会卸载。这样实际上就是用空间换时间,牺牲内存换取效率,这是普遍采用的方法。我认为如果不是非要牺牲效率换内存空间的时候,最好不要在这上面浪费时间。
2、VB的语法已经确定了不能直接实现你的要求。大多数语言实际上都要求如果你要用到某个Dll里面的函数,都需要预先指定,然后在程序里面调用。你可以通过一些API设计一套调用机制来实现。以下流程可以参考:
(1)使用LoadLibrary加载Dll
(2)使用GetProcAddress获取函数地址
(3)使用CallAnyFunc调用这个函数(CallAnyFunc的代码如下,感谢该代码作者,详细信息可以在网上找到)
声明区:
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 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
1、对于资源的浪费问题。动态加载实际上是已经存在的,一个Dll中可能包含很多的函数,而且Dll文件本身可能不大,几百兆的已经算是大文件了,对于现在的系统硬件来说,这些资源的开销应该不是太大的问题。当然,这里没有考虑到你究竟设计的是怎样的一个软件,所以姑且做这个假设。实际上如果Dll只在函数被用到时加载,不用时就卸载,效率本身就会受到影响。目前Dll都是加载后存在于内存中,直到程序关闭才会卸载。这样实际上就是用空间换时间,牺牲内存换取效率,这是普遍采用的方法。我认为如果不是非要牺牲效率换内存空间的时候,最好不要在这上面浪费时间。
2、VB的语法已经确定了不能直接实现你的要求。大多数语言实际上都要求如果你要用到某个Dll里面的函数,都需要预先指定,然后在程序里面调用。你可以通过一些API设计一套调用机制来实现。以下流程可以参考:
(1)使用LoadLibrary加载Dll
(2)使用GetProcAddress获取函数地址
(3)使用CallAnyFunc调用这个函数(CallAnyFunc的代码如下,感谢该代码作者,详细信息可以在网上找到)
声明区:
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 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
追问
代码区的赋值是干什么的?
那堆注释乱码是什么意思?
是在哪个网页上找到的?
追答
赋值的部分实际是汇编代码,用于处理调用API时的参数传递问题。这是网上的一段经典代码,作者应该是ASM在VB上应用的高手。
那段乱码是编码的问题,在If之中,注释的主要内容是说明如果该判断成立,则以上函数调用失败。
展开全部
什么叫动态调用?自己写调用函数。dll放到资源里,随时调用多好?干嘛绕弯路
追问
放资源我自然知道,但是我要问的不是这个
追答
你想问啥?你说明白了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
80%你调用的DLL中代码问题引起的!
19%你调用DLL后,未将create的对象给释放了!
1%环境因素!
19%你调用DLL后,未将create的对象给释放了!
1%环境因素!
追问
我问的是调用方法,是怎么调用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询