如何用VB调用普通的动态库
在调用动态库时出现如下图的报错。可能的原因有字符串参数不是unicode编码的,也可能是函数的字符串参数是字符串指针,没有传入正确的地址,跪求大神帮我分析下原因...
在调用动态库时出现如下图的报错。可能的原因有字符串参数不是unicode编码的,也可能是函数的字符串参数是字符串指针,没有传入正确的地址,跪求大神帮我分析下原因
展开
2个回答
展开全部
关于你的问题,我有一些建议。
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询