古詩詞大全網 - 成語解釋 - vb動態調用動態鏈接庫

vb動態調用動態鏈接庫

關於妳的問題,我有壹些建議。

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