2009年1月31日 星期六

用Visual C++製作VB6可使用的dll

vb6是一套相當好用的程式設計工具,但是它的缺點就是速度慢。所以,如果需要大量運算的時候,就可以使用C++來撰寫這些運算的函式,vb只要呼叫使用就可以了。我在這裡要說明使用Visual C++製作dll給vb6使用的方法,希望對需要用的人有幫助。


我用的軟體是Visual C++ 2005 和 Visual Basic 6.0 Professional
假設我的專案名稱為dlltest
首先,開啟vc++,在「新增專案」中選擇「Win32專案」,在專案精靈中選擇 dll 選項,以及勾選「空專案」,然後按下「完成」,精靈就幫我們製作了一個dll專案檔
因為這個專案檔是空的,所以沒有檔案,我們必須自行新增一個.cpp檔案,一個.h標頭檔還有一個.def定義檔,必須要有這個定義檔,vb6才可以使用這個dll
注意.cpp及.h的檔名必須相同
記得在header檔中include必要的檔案

# include <cstdlib>
# include <windows.h>
在cpp檔中include header檔
# include "dlltest.h"
撰寫函式時,加入「WINAPI」這個字,例如: dlltest.h
int WINAPI fntest(void); int WINAPI add1(int number);
dlltest.cpp
int WINAPI fntest(void){ return 0; } int WINAPI add1(int number){ return number+1; }
寫完所有函式後,下一個步驟就是撰寫def定義檔 在def中先加上EXPOTS,然後再把每一個函式的「名稱」逐行加上去。 dlltest.def
EXPORTS fntest add1 ...

接下來就是vb6的部分 在vb的專案中新增一個模組(module) 在這個module裡面使用以下方法來宣告函式 (注意以下是同一行,不要寫成多行)
Declare Function vb使用時的函式名稱 Lib "dll檔名" Alias "dll裡的函式名稱" (參數) As 回傳型態
vb使用時的函式名稱就是在vb中呼叫這個函式時要使用的名稱。
dll檔名就是剛才用vc++製作並放到system32目錄的dll檔名。
dll裡的函式名稱就是剛才那個dll中的函式名稱,如果與第一項相同就不用寫。
參數就是這個函式要用到的參數。 回傳型態就是這個函式的回傳型態。 例如如果我們要呼叫剛才寫的add1的話就可以這樣寫 Module1.bas
Declare Function LongAdd1 Lib "dlltest" Alias "add1" (ByVal n as Long) As Long
Form1.frm
Private Sub Form_Load() Form1.Caption = LongAdd1(1) End Sub
要注意的是,vc++裡面的 int 和 long 在 vb裡面都是 long。還有其他參數轉換的問題請見MSDN或上網搜尋。

沒有留言: