VB中創建可以輸出函數的DLL

VB編譯文件實際上採取了兩次編譯的方法,首先是調用 c2.exe 產生 OBJ 文件,然後調用 Link.exe 連接。如果在link的時候添加EXPORT 選項,實際上是可以輸出函數的。但是,在VB的工程選項中將這些屏蔽了。而且過分的是:VB在Build完成後會將OBJ文件刪除,這樣就無法通過 Link來輸出函數了。不過我找到一個比較齷鹺的變通的方法,就是先創建一個Exe工程,在Form_Load事件裡面寫下面的語句:

Private Sub Form_Load()

  If (MsgBox("hehe", vbOKCancel) = vbOK) Then

    Shell "link2.exe " & Command$

  End If
  End

End Sub

  然後編譯為linktemp.exe,接下來將LINK.EXE改名為Link2.exe,將linktemp.exe改名為link.exe。這樣在VB調用link.exe時會彈出對話框,處理就會中斷。這時就可以有機會將OBJ文件拷貝出來了 J

  然後我創建了一個ActiveX DLL工程,在這個工程裡面添加一個Module並創建一個Public函數mathadd:

Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long
  mathadd = a + b
End Function

  Builder這個工程,在Link的時候就會中斷。然後把創建的Class1.obj、Module1.obj、Project1.obj備份出來。

  然後就可以調用Link2.exe連接OBJ到DLL了,我的連接代碼是:
link2.exe "e:vbdllClass1.obj" "e:vbdllModule1.obj" "e:vbdllProject1.obj" "E:Program FilesMicrosoft Visual StudioVB98VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:vbdllProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS

  注意裡面的/ENTRY和/EXPORT開關,/EXPORT開關聲明了輸出函數mathadd。這樣就大功告成了 :-D,可以被其他語言引入,例如在VB中,只需要:

Private Declare Function mathadd Lib "e:vbdllProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License