关于你的问题,我有一些建议。
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 只要, ByVal Msg 只要, ByVal wParam 只要, lParam) 只要
代码区:
私有函数 CallAnyFunc(ByVal pFn As Long, ByVal pParam)只要,ByVal 计数一样长
Dim CallAnyFuncCode(34) 只要,lRet 只要
CallAnyFuncCode(0) = amp;H53EC8B55
CallAnyFuncCode(1) = amp;HE8amp;
CallAnyFuncCode(2) = amp;HEB815B00
CallAnyFuncCode(3) = amp;H1000112C
CallAnyFuncCode(4) = amp;H114A938D
CallAnyFuncCode(5) = amp;H64521000
CallAnyFuncCode(6) = amp;H35FFamp;
CallAnyFuncCode(7) = amp;H89640000
CallAnyFuncCode(8) = 放大器;H25amp;
CallAnyFuncCode(9) = 放大器;H8B1FEB00
CallAnyFuncCode(10) = 放大器;HE80C2444
CallAnyFuncCode(11) = amp;H0amp;
CallAnyFuncCode(12) = amp;H53E98159
CallAnyFuncCode(13) = amp;H8D100011
CallAnyFuncCode (14) = amp;H119791
CallAnyFuncCode(15) = amp;HB8908910
CallAnyFuncCode(16) = amp;H33000000
CallAnyFuncCode(17) = amp ;H558BC3C0
CallAnyFuncCode(18) = amp;H104D8B0C
CallAnyFuncCode(19) = amp;
HEB8A148D
CallAnyFuncCode(20) = 放大器;HFC528D06
CallAnyFuncCode(21) = 放大器;HB4932FF
CallAnyFuncCode(22) = 放大器;H8BF675C9
CallAnyFuncCode(23) = amp;HD0FF0845
CallAnyFuncCode(24) = amp;H58F64
CallAnyFuncCode(25) = amp;H83000000
CallAnyFuncCode( 26) = amp;H4D8B04C4
CallAnyFuncCode(27) = amp;H5B018914
CallAnyFuncCode(28) = amp;H10C2C9
CallAnyFuncCode(29) = amp; H58F64
CallAnyFuncCode(30) = 放大器;H83000000
CallAnyFuncCode(31) = 放大器;HC03304C4
CallAnyFuncCode(32) = 放大器;H89144D8B
CallAnyFuncCode(33) = amp;HC2C95B21
CallAnyFuncCode(34) = amp;H90900010
CallAnyFunc = CallAsmCode(CallAnyFuncCode(0), pFn, pParam, Count, lRet)
如果 CallAnyFunc lt;gt;lRet 那么
CallAnyFunc = 0 '±í??í?ó??±????????·?·?
Debug.Assert False '?ò?????3?ò???·?·??×÷?
结束 If
结束函数