一般VB.NET呼叫DLL可以透過Declare 語句在模組級用於宣告對動態連結庫 (DLL) 中的外部過程的引用。
Private Declare Sub
myFunc1 Lib "mylib.dll"
(ByVal strName As String)
但是,VB.NET,C#.NET建立的DLL是個類庫,不能生成標準的 DLL 檔案,不能採用declare ()的方式。應該在解決方案資源管理器下的需要引用的專案的引用欄點選滑鼠右鍵-->新增對這個類庫[mylib.dll]的引用即可。
以下為VB.NET呼叫DLL程式碼示例:
< DllImport("kcomm.dll", CharSetCharSet:
=CharSet.Ansi, SetlastError:=True)>
Private Shared Function gettxt(ByVal
port As Integer, ByVal wait As
Integer, ByVal _date As Long,
ByVal _time As Long, ByVal
filename As String) As Integer
End Function
根據實際情況更改你的DLL名稱、函式名、引數名和型別。
VB.NET呼叫DLL的只是COM元件,無法作為輸出函式的DLL,其實這只是個錯誤的說法。其實MS非常狡猾,如果你是個VB瘋狂發燒友的話,應該早就狂試出這種可以建立輸出函式的DLL的方法。
VB編譯檔案實際上採取了兩次編譯的方法,首先是呼叫C2.exe產生*.OBJ檔案,然後呼叫Link.EXE連線。如果在LINK的時候新增EXPORT選項,實際上是可以輸出函式的。但是,在VB的工程選項中將這些遮蔽了。而且過分的是:VB在Build完成後會將OBJ檔案刪除,這樣就無法手動透過Link來建立我們需要的DLL了。不過我找到一個比較齷鹺的變通的方法,就是先建立一個Exe工程,在Form_Load事件裡面寫下面的語句:
Sub Main
If MsgBox("哈哈",
vbOKCancel) = vbOK Then
Shell "link2.exe "
& Command$
End If
End Sub
然後編譯為LinkTemp.EXE,接下來將LINK.EXE改名為Link2.exe,將LinkTemp.EXE改名為Link.EXE。這樣在VB呼叫Link.EXE時會彈出對話方塊,處理就會中斷。這時就可以有機會將OBJ檔案複製出來了。
然後我建立了一個ActiveX DLL工程,在這個工程裡面新增一個Module並建立一個Public函式mathadd:
Public Function mathadd
(ByVal a As Long, ByVal
b As Long) As Long
mathadd = a + b
編譯這個工程,在Link的時候就會中斷。然後把建立的Class1.obj、Module1.obj、Project1.obj備份出來。然後就可以呼叫Link2.exe連線OBJ到DLL了,我的連線程式碼是:
Link2.exe "e:\\vbdll\\Class1.obj"
"e:\\vbdll\\Module1.obj"
"e:\\vbdll\\Project1.obj"
"E:\\Program Files\\Microsoft
Visual Studio\\VB98\\VBAEXE6.LIB"
/ENTRY:__vbaS /EXPORT:mathadd /OUT:
"e:\\vbdll\\ProjectOK.dll"
/BASE:0x11000000 /SUBSYSTEM:
WINDOWS,4.0 /VERS
注意裡面的/ENTRY和/EXPORT開關,/EXPORT開關聲明瞭輸出函式mathadd。這樣就大功告成了,可以被其他語言引入,例如在VB中,只需要:
Private Declare Function mathadd
Lib "e:\\vbdll\\ProjectOK.dll"
(ByVal a As Long, ByVal b As
Long) As Long
一般VB.NET呼叫DLL可以透過Declare 語句在模組級用於宣告對動態連結庫 (DLL) 中的外部過程的引用。
Private Declare Sub
myFunc1 Lib "mylib.dll"
(ByVal strName As String)
但是,VB.NET,C#.NET建立的DLL是個類庫,不能生成標準的 DLL 檔案,不能採用declare ()的方式。應該在解決方案資源管理器下的需要引用的專案的引用欄點選滑鼠右鍵-->新增對這個類庫[mylib.dll]的引用即可。
以下為VB.NET呼叫DLL程式碼示例:
< DllImport("kcomm.dll", CharSetCharSet:
=CharSet.Ansi, SetlastError:=True)>
Private Shared Function gettxt(ByVal
port As Integer, ByVal wait As
Integer, ByVal _date As Long,
ByVal _time As Long, ByVal
filename As String) As Integer
End Function
根據實際情況更改你的DLL名稱、函式名、引數名和型別。
VB.NET呼叫DLL的只是COM元件,無法作為輸出函式的DLL,其實這只是個錯誤的說法。其實MS非常狡猾,如果你是個VB瘋狂發燒友的話,應該早就狂試出這種可以建立輸出函式的DLL的方法。
VB編譯檔案實際上採取了兩次編譯的方法,首先是呼叫C2.exe產生*.OBJ檔案,然後呼叫Link.EXE連線。如果在LINK的時候新增EXPORT選項,實際上是可以輸出函式的。但是,在VB的工程選項中將這些遮蔽了。而且過分的是:VB在Build完成後會將OBJ檔案刪除,這樣就無法手動透過Link來建立我們需要的DLL了。不過我找到一個比較齷鹺的變通的方法,就是先建立一個Exe工程,在Form_Load事件裡面寫下面的語句:
Sub Main
If MsgBox("哈哈",
vbOKCancel) = vbOK Then
Shell "link2.exe "
& Command$
End If
End Sub
然後編譯為LinkTemp.EXE,接下來將LINK.EXE改名為Link2.exe,將LinkTemp.EXE改名為Link.EXE。這樣在VB呼叫Link.EXE時會彈出對話方塊,處理就會中斷。這時就可以有機會將OBJ檔案複製出來了。
然後我建立了一個ActiveX DLL工程,在這個工程裡面新增一個Module並建立一個Public函式mathadd:
Public Function mathadd
(ByVal a As Long, ByVal
b As Long) As Long
mathadd = a + b
End Function
編譯這個工程,在Link的時候就會中斷。然後把建立的Class1.obj、Module1.obj、Project1.obj備份出來。然後就可以呼叫Link2.exe連線OBJ到DLL了,我的連線程式碼是:
Link2.exe "e:\\vbdll\\Class1.obj"
"e:\\vbdll\\Module1.obj"
"e:\\vbdll\\Project1.obj"
"E:\\Program Files\\Microsoft
Visual Studio\\VB98\\VBAEXE6.LIB"
/ENTRY:__vbaS /EXPORT:mathadd /OUT:
"e:\\vbdll\\ProjectOK.dll"
/BASE:0x11000000 /SUBSYSTEM:
WINDOWS,4.0 /VERS
注意裡面的/ENTRY和/EXPORT開關,/EXPORT開關聲明瞭輸出函式mathadd。這樣就大功告成了,可以被其他語言引入,例如在VB中,只需要:
Private Declare Function mathadd
Lib "e:\\vbdll\\ProjectOK.dll"
(ByVal a As Long, ByVal b As
Long) As Long