回覆列表
  • 1 # 藍風24

    一般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

  • 中秋節和大豐收的關聯?
  • 廢水脫色的工藝是什麼?