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 '?òΪ?IJ?⣬³?ò?ѳ?·?·¨?×÷?
End If
End Function