回覆列表
  • 1 # mini蜜蜂嗡嗡嗡

    1.DLL的隱式呼叫

    隱式連結採用靜態載入的方式,比較簡單,需要.h、.lib、.dll三件套。新建“控制檯應用程式”或“空專案”。配置如下:

    專案->屬性->配置屬性->VC++ 目錄-> 在“包含目錄”裡新增標頭檔案testdll.h所在的目錄

    專案->屬性->配置屬性->VC++ 目錄-> 在“庫目錄”裡新增標頭檔案testdll.lib所在的目錄

    專案->屬性->配置屬性->連結器->輸入-> 在“附加依賴項”裡新增“testdll.lib”(若有多個 lib 則以空格隔開) 。 //你也可以在程式碼中新增一行設定庫的連結,#pragma comment(lib, "DLLSample.lib")

    庫檔案標頭檔案等目錄設定,本文將庫檔案及標頭檔案複製到工程目錄下DLL資料夾下

    新增LIB依賴項

    呼叫的源程式#

    // callmyDLL.cpp : 定義控制檯應用程式的入口點。

    //包含頭標頭檔案,函式宣告

    #include "stdafx.h"

    #include "stdlib.h"

    #include "myDLL.h"

    int _tmain(int argc, _TCHAR* argv[])

    {

      //這是透過上節的extern方式呼叫的

    int z= Add(1,2);

      

      //也可以透過類匯出的方式呼叫

      //CmyDll dll;

      //int z = dll.Add(1,2);

    printf("z is:%d\n", z);

    system("pause");

    return 0;

    }

    以上如果包含目錄、庫目錄、庫的依賴項都沒有問題就可以生成成功了

    #執行時最後一步:將動態庫檔案複製到可執行檔案目錄下,否則會出現如下錯誤。

    如何沒有設定lib目錄和依賴項,可以在程式碼中新增以下一行程式碼也可以生成成功

    // callmyDLL.cpp : 定義控制檯應用程式的入口點。

    //包含頭標頭檔案,函式宣告

    #include "stdafx.h"

    #include "stdlib.h"

    #include "myDLL.h"

    #prama comment(lib, "myDll.lib")

    //此時的myDll.lib的路徑必須能找到的,可以給定一個全路徑如:“c:\\myDll.lib”

    int _tmain(int argc, _TCHAR* argv[])

    {

    int z= Add(1,2);

    printf("z is:%d\n", z);

    system("pause");

    return 0;

    }

    所以透過設定依賴項和庫目錄和新增#Prama是具有相同效果的,如果有問題,得檢查是否兩者的生成平臺不同(如win32和x64)或者一個是Debug一個是release

    2、DLL顯示呼叫

    對於顯示連線,即動態載入我們需要呼叫LoadLibrary

    在MSDN中:HMODULE WINAPI LoadLibrary(

    __in LPCTSTR lpFileName

    );

    它的功能是對映一個可執行模組到呼叫程序的地址空間。由此我們知道顯示呼叫就是函式指標來呼叫函式。

    Steps:

    1、宣告標頭檔案<windows.h>,說明我想用windows32方法來載入和解除安裝DLL

    2、然後用typedef定義一個指標函式型別.typedef void(*fun) //這個指標型別,要和你呼叫的函式型別和引數保持一致

    3、定一個控制代碼例項,用來取DLL的例項地址。HINSTANCE hdll;

    格式為hdll=LoadLibrary(“DLL地址”);這裡字串型別是LPSTR,當是unicode字符集的時候會不行,

    因此要在配置-屬性-常規裡面把預設字符集“unicode”改成支援多字元擴充套件即可。

    4、取的地址要判斷,返回的控制代碼是否為空,如果為無效控制代碼,那麼要釋放載入DLL所佔用的記憶體。

    5、定義一個函式指標,用來獲取你要用的函式地址。

    然後透過GetProcAdress來獲取函式的地址,引數是DLL的控制代碼和你要呼叫的函式名:比如:FUN=(fun)GetProcAdress(hdll,"sum");

    這裡也要判斷要函式指標是否為空,如果沒取到要求的函式,那麼要釋放控制代碼。

    6、然後透過函式指標來呼叫函式。

    7、呼叫結束後,就釋放控制代碼FreeLibrary(hdll);

    直接上程式碼,一一一一一目瞭然

    // callDLLSee.cpp : 定義控制檯應用程式的入口點。

    //透過呼叫windowsAPI 來載入和解除安裝DLL

    #include "stdafx.h"

    #include "Windows.h"

    typedef int(*Dllfun)(int , int);

    int _tmain(int argc, _TCHAR* argv[])

    {

    Dllfun funName;

    HINSTANCE hdll;

    //put DLL under the Debug path

    //use _T 設定為寬字元

    hdll = LoadLibrary( _T("myDLL.dll"));

    if (hdll == NULL)

    {

    FreeLibrary(hdll);

    }

    funName = (Dllfun)GetProcAddress(hdll, "Add");

    if (funName == NULL)

    {

    FreeLibrary(hdll);

    }

    int x = 1, y = 10;

    double z= funName(r, h);

    printf("z= %d\n", z);

    FreeLibrary(hdll);

    return 0;

    }

  • 中秋節和大豐收的關聯?
  • 關於西風的詩句?