1. 程式人生 > >在執行時呼叫動態連結庫 VS2010示例

在執行時呼叫動態連結庫 VS2010示例

這裡不再介紹動態連結庫概念等知識,純粹新建一個專案用來表述怎麼在執行時呼叫動態連結庫,程式碼中會給出相關注釋。開發工具用的是VS2010旗艦版。

一、建立動態連結庫專案:

1.新建專案——選擇Win32專案,輸入名稱後(這裡我輸入的專案名稱為sunlib),然後選擇下一步,在隨後的應用程式型別中選擇 “DLL”,單擊完成,即可完成建立DLL專案

如下圖所示:

2.在DLL專案中新增匯出函式,函式可以新增在dllmain.cpp中,也可以新增在sumlib.cpp中,這裡新增在sumlib.cpp中:

複製程式碼
//這裡新增一個計算兩數和的匯出函式
// extern "C"表示函式可以被C語言引用
// _declspec(dllexport)指定這是一個到處函式 extern "C"_declspec(dllexport) int sum(int a,int b) { return a+b; }
複製程式碼

新增程式碼後,啟動除錯就可以在sumlib專案資料夾下的Debug資料夾下看到生成的sumlib.dll和sumlib.lib檔案:

二、載入和使用DLL

1.新建一個基於對話方塊的MFC專案,命名為MFCEx7,介面設計如下圖:

2.使用載入時動態連結的程式需要匯入庫(*.lib檔案),在MFCEx7專案中,開啟MFCEx7專案屬性框,依次選擇——聯結器——輸入,在附加依賴項中新增sumlib.lib:

此時,需要把sumlib專案生成的sumlib.lib檔案和sumlib.dll檔案複製到MFCEx7專案資料夾下;

 3.為ADD按鈕新增點選事件響應函式:

複製程式碼
HINSTANCE hinstLib;
PROCSUM procsum;

BOOL  fFreeResult;

//載入DLL檔案,獲取DLL控制代碼
hinstLib = LoadLibrary(L"sumlib.dll");

//控制代碼有效,獲取sum函式地址
if ( hinstLib != NULL )
{
    procsum = (PROCSUM)GetProcAddress(hinstLib,"sum");

    
if( procsum != NULL ) { CEdit *pSumEdit=(CEdit*)GetDlgItem(IDC_EDIT_SUM); int a = GetDlgItemInt(IDC_EDIT_A); int b = GetDlgItemInt(IDC_EDIT_B); CString szSum; szSum.Format(_T("%d"),a+b); pSumEdit->SetWindowText(szSum); } fFreeResult = FreeLibrary(hinstLib); }
複製程式碼

4、編譯執行,即可執行成功。

c++中.dll與.lib檔案的生成與使用的詳解

c++中.dll與.lib檔案的生成與使用的詳解

--------------------------------------------------------------------------------

兩種庫:

•  包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link library。
•  包含函式程式碼本身,在編譯時直接將程式碼加入程式當中,稱為靜態連結庫static link library。
共有兩種連結方式:

•  動態連結使用動態連結庫,允許可執行模組(.dll檔案或.exe檔案)僅包含在執行時定位DLL函式的可執行程式碼所需的資訊。
•  靜態連結使用靜態連結庫,連結器從靜態連結庫LIB獲取所有被引用函式,並將庫同程式碼一起放到可執行檔案中。

--------------------------------------------------------------------------------

兩種檔案的區別

--------------------------------------------------------------------------------

使用lib需注意兩個檔案:

•.h標頭檔案,包含lib中說明輸出的類或符號原型或資料結構。應用程式呼叫lib時,需要將該檔案包含入應用程式的原始檔中。
•.LIB檔案。

使用dll需注意三個檔案:

•.h標頭檔案,包含dll中說明輸出的類或符號原型或資料結構的.h檔案。應用程式呼叫dll時,需要將該檔案包含入應用程式的原始檔中。
•.LIB檔案,是dll在編譯、連結成功之後生成的檔案,作用是當其他應用程式呼叫dll時,需要將該檔案引入應用程式,否則產生錯誤(如果不想用lib檔案或者沒有lib檔案,可以用WIN32 API函式LoadLibrary、GetProcAddress裝載)。
•dll檔案,真正的可執行檔案,開發成功後的應用程式在釋出時,只需要有.exe檔案和.dll檔案,並不需要.lib檔案和.h標頭檔案。

--------------------------------------------------------------------------------

生成和使用方法

--------------------------------------------------------------------------------

作業系統:WIN7

開發軟體:VS2010

--------------------------------------------------------------------------------

1.生成lib檔案

  首先,我們先建立一個控制檯工程(新建->工程->控制檯程式),新增add.cpp以及add.h檔案。

複製程式碼程式碼如下:
//sub.h
#ifndef _SUB_H
#define _SUB_H
void sub(int a,int b);
#endif

//sub.cpp
#include "sub.h"
#include <iostream>

void sub(int a,int b)
{
    std::cout<<(a-b)<<std::endl;
}

  由於在工程中,沒有main()函式,所以直接編譯出錯。這時,要右鍵點選工程,並選擇工程屬性,出現下圖,選擇靜態連結庫即可。

  這時候再按F7,build solution即可產生lib檔案。在Debug中只生成.lib檔案。

2.生成dll檔案

  生成dll檔案的過程與上面的過程是一樣的,只是在選擇Dynamic Library(.dll)即可。在Debug中會生成一個.lib和.dll兩種檔案。

--------------------------------------------------------------------------------

3.兩種檔案的使用

  在使用時,靜態連結庫只要把.h和.lib檔案加入到工程資料夾中即可。而動態連結庫要把.h、.lib和.dll檔案加入到工程中。

複製程式碼程式碼如下:
#include <iostream>
#include "sub.h"  //連結庫的標頭檔案
using namespaces std;

#pragma comment(lib,"sub.lib") //加入連結庫

int main()
{
    sub(5,4);
    return 0;
}


4.僅有.dll檔案時候的使用方法

  在沒有.h和.lib檔案時,需要函式指標和WIN32 API函式LoadLibrary、GetProcAddress裝載,只需要.dll檔案即可(將.dll檔案置入工程目錄中)。

複製程式碼程式碼如下:
#include <iostream>
#include <windows.h>               //使用函式和某些特殊變數
typedef void (*DLLFunc)(int,int);  //確定呼叫函式的形參
int main()
{
    DLLFunc dllFunc;
    HINSTANCE hInstLibrary = LoadLibrary("sub.dll");//載入.dll

    if (hInstLibrary == NULL)
    {
        FreeLibrary(hInstLibrary);
    }
    dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "sub");//第二個引數為要呼叫的函式名稱
    if (dllFunc == NULL)
    {
        FreeLibrary(hInstLibrary);
    }
    dllFunc(5,4);
    FreeLibrary(hInstLibrary);
    return(1);
}


   最近一直在搞API這東西,用了curl、tinyxml和jsoncpp幾種開源的庫,在linux下使用倒是很方便,在windows下還是自己編譯的遇到了點問題,從新整理學習下,備用~~
網址:http://www.cnblogs.com/vitah/p/3780891.html           http://www.jb51.net/article/36447.htm