DLL(VFB教程2-8)

  勇芳 2018-2-16 3003

此處為VisualFreeBasic編程教程(從零開始學或VB進階)的子章節部分,全部目錄點鏈接。

寫DLL

QQ截圖20180216185655.jpg

點編譯DLL,就可以,產生出了DLL,DLL是寫好的??楦鸕娜砑饔媚鉊LL里的函數。

被EXE加載與卸載

Function FF_WINMAIN( ByVal hInstance     As HINSTANCE, _
                     ByVal hPrevInstance As HINSTANCE, _
                     ByRef lpCmdLine     As String, _  
                     ByVal iCmdShow      As Long ) As Long
   'hInstance 當前DLL??榫潯?nbsp; iCmdShow DLL狀態通知,就2個  其它參數為空。
  Select Case iCmdShow 'fdwReason
    Case DLL_PROCESS_ATTACH '加載DLL,DLL被加載到內存時,可以做任意事,包括耗時間等
        AfxMsg "DLL被加載到內存時"
    Case DLL_PROCESS_DETACH '卸載DLL,DLL被卸載或軟件退出時,需要快速完成,不能用進程鎖。
         AfxMsg "DLL被卸載時"
  End Select

End Function

此函數,在VFB工程【資源】里的【特殊函數】里,并不是你自己寫的函數。

這是DLL起始函數。

'函數后面加 Export 就表示導出此函數,其它軟件才可以調用

'--------------------------------------------------------------------------
Public Function Add2( ByVal x As Integer, ByVal y As Integer ) As Integer Export
'函數后面加 Export 就表示導出此函數,其它軟件才可以調用
'然后 編譯為DLL

  Return( x + y )
End Function
  '--------------------------------------------------------------------------
Public Function ok( aa As String  ) As  String Export
'函數后面加 Export 就表示導出此函數,其它軟件才可以調用
'然后 編譯為DLL

  Function=aa
End Function

FB 生成的DLL,函數名后面帶符號,其它語言調用,需要用 DLL查看器看函數輸出名,

要是給 FB調用,同時吧  【???.dll.a】文件復制過去,就不管符號了。生成的EXE后,就不需要帶【???.dll.a】 文件

DLL 里函數名稱,全部變成大寫,且帶符號,如: [email protected]


靜態調用DLL

先聲明DLL,需要在 【資源】里的【特殊函數】 FF_AppStart ??槔?br />

Declare Function Add2 Lib "開發DLL例題" ( ByVal x As Integer, ByVal y As Integer ) As  Integer
Declare Function ok Lib "開發DLL例題" ( aa As String  ) As  String

是FB編譯的DLL,必須把【 lib開發DLL例題.dll.a 】文件一起和 DLL 文件 復制來用,不然不可以編譯

生成EXE后,此文件不需要帶。

其它軟件,比如 C 生成的DLL,必須先把DLL復制到軟件輸出文件夾中,才可以

Declare Function 函數名 Lib "dll文件" Alias "DLL中的函數名"(ByVal eID As Integer  ) As  Integer

聲明后,就像是自己的函數使用DLL里的函數了

注意:DLL文件,只能寫文件名,不可以帶 擴展名,.DLL 不能打上去。

FF_Control_SetText  HWND_FORM1_TEXT1 ,Str(  Add2 (100,Rnd*100))
AfxMsg ok("ddddd")

動態調用DLL

  Dim As Any Ptr library = DyLibLoad( "開發DLL例題" ) '就文件名,不能帶 .DLL 
  If ( library = 0 ) Then
      AfxMsg "加載DLL失敗"
      Return 1
  End If
  Dim AddNumbers As Function( ByVal As Integer, ByVal As Integer ) As Integer
  AddNumbers = DyLibSymbol( library, "ADD2" )  ' 特別提醒,必須全部大寫
  '從DLL查看器里可以看到全稱是 [email protected] ,而FB用FB的DLL可以省略  @8 的符號 
  
  If ( AddNumbers = 0 ) Then
      AfxMsg "無法從開發DLL例題庫中檢索Add2()函數的地址"
      Return 1
  End If

  FF_Control_SetText  HWND_FORM1_TEXT2 ,Str(  AddNumbers (100,Rnd*100))
  
  AfxMsg "使用完成"
  DyLibFree( library )  '卸載DLL ,特別注意,假如DLL還在工作,卸載會讓軟件崩潰
  '本例題里,加載會彈窗提示,就是在工作,必須先關彈窗在卸載



最新回復 (4)
    您需要登錄后才可以回帖 登錄 | 注冊
  • wq1282 4月前
    用VB.NET來調用這個dll,在字符串這塊總是提示錯誤:嘗試讀取或寫入受?;さ哪詿?nbsp;。這通常指示其他內存已損壞。
    哎,怎么才可以像Windows APi那樣普通調用,不報錯呢。
  •   勇芳 5月前
    vhvihs0668 大BUG,根本無法調用dll,無論相對路徑還是絕對路徑,總是找不到dll,哪怕例題都無法通過。
    不是BUG,是因為你寫錯了,不可以帶擴展名,必須在聲明??槔鍔?。
  • 有說遇到這個問題嗎?

  • 大BUG,根本無法調用dll,無論相對路徑還是絕對路徑,總是找不到dll,哪怕例題都無法通過。

返回