vb6.0 IDE開發環境能創建 Activex DLL工程,這類工程發佈的DLL,從嚴格意義上VB建立的DLL並不是像VC一樣的動態連結程式庫,VB建立的是ActiveX DLL,不能像kernel32.dll」那樣通過「Declare Function .....」來調用的,這種ActiveX DLL是通過訪問類的方式調用的:step1,註冊DLL;step2,開一個「標準EXE」工程,然後在「工程」選項中,按一下「引用」,找到「.dll」的檔案名,在前面的核取方塊中打勾,代碼 新建一個類,訪問類的方法,如下:

 

Dim Ncls As New PRO.Class1
Ncls.Function1(para1)

 

那VB怎樣創建「標準」的DLL呢?

 

一,VB編譯檔原理

 

首先需要明白VB編譯檔時實際上採取了兩次編譯的方法,首先是調用C2.exe產生*.OBJ檔,然後調用Link.EXE連接,C2.exe 和LINK.exe 在VB的安裝目錄可以找到:C:\Program Files\Microsoft Visual Studio\VB98。如果在LINK的時候添加EXPORT選項,實際上是可以輸出函數的。但是,在VB的工程選項中將這些遮罩了。而且過分的是:VB在Build完成後會將OBJ檔刪除,這樣就無法手動通過Link來創建我們需要的DLL了。

 

二,製作「標準」DLL檔

 

對於「link.exe」,可以通過改變參數來調整其編譯連結後的結果。因此,我們可以通過截獲工程的obj檔,再把調用LINK.exe連結這些obj檔,並指明「/EXPORT」的函數即可。

 

第一步,如何截獲工程的obj檔

 

步驟一:建立一個假的「Link.exe」;

 

建立一個新的專案,在那個專案中建立一個「Form」,然後,在「Form」中加入如下代碼:
Private Sub Form_Load()
MsgBox "現在可以拷貝OBJ檔了!"
End
End Sub

 

編譯為:Link.exe

 

步驟二:將「C:\Program Files\Microsoft Visual Studio\VB98\Link.exe」改名為「Link2.exe」;
 
步驟三:將假的那個Link.exe複製到「C:\Program Files\Microsoft Visual Studio\VB98\」中;
通過以上三步就可以在VB調用Link.EXE時會彈出對話方塊,處理就會中斷。這時就可以有機會將OBJ檔拷
 
貝出來了。
第二步,生成obj檔
 
步驟一:建立一個新專案(VBStardDLL.vbp),選擇「ActiveX DLL」,此時自動生成一個Class1類,添加一個「Module」,命名為Module1,在Module1中加入如下代碼:
 
Public Function mathAdd(ByVal a As Long, ByVal b As Long) As Long
mathAdd = a + b
End Function
Public Function mathIncremente(ByVal a As Long, ByVal b As Long) As Long
mathIncremente= a * b
End Function
這裡特別注意:需要輸出的函數必須寫在模組(Module)中,寫在類(Class)裡面是不能輸出的。
步驟二:用VB功能表編譯(檔-->生成Project1.dll)
當編譯的時候會彈出一個對話方塊
步驟三:到當前工程目錄下複製出OBJ檔,Class1.OBJ,Module1.OBJ,VBStardDLL.OBJ,將這三個檔案複製到:「D:\LINKOBJ」這個資料夾。
第三步,生成DLL檔
步驟一,到cmd下,運行C:\Program Files\Microsoft Visual Studio\VB98 目錄下的LINK2.exe,連結代碼為:
LINK2.exe "D:\LINKOBJ\Class1.obj" "D:\LINKOBJ\Module1.obj" "D:\LINKOBJ\VBStardDLL.obj" "c:\Program Files\Microsoft Visual StudioVC\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathAdd /EXPORT:mathIncremente /OUT:"D:\LINKOBJ\VBStardDLL.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS 至此已在目錄 D:\LINKOBJ下生成了 VBStardDLL.dll 的檔。
第四步,測試


 

 

新建一個標準exe工程,在一個module中做如下聲明:
 
Public Declare Function mathAdd Lib "D:\LINKOBJ\VBStardDLL.dll" (ByVal val1 As Long, ByVal val2 As Long) As Long
Public Declare Function mathIncremente Lib "D:\LINKOBJ\VBStardDLL.dll" (ByVal val1 As Long, ByVal val2 As Long) As Long
 
在一個form裡面,兩個按鈕:
 
Private Sub Command1_Click()
Dim val11 As Long
Dim val22 As Long
Dim resu As Long
val11 = 6
val22 = 4
resu = mathAdd(val11, val22)
MsgBox resu
End Sub
Private Sub Command2_Click()
Dim val11 As Long
Dim val22 As Long
val11 = 6
val22 = 4
Dim resu As Long
resu = mathIncremente(val11, val22)
MsgBox resu
End Sub
 
測試通過。
 
本文參考的博文位址:HTTP://useway.blog.51cto.com/736087/295201
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()