1. 程式人生 > >vc中dll匯出匯入簡單教程

vc中dll匯出匯入簡單教程

dll和lib的區別

未完待續

如何匯出dll

查閱msdn官方文件發現,匯出dll有三種方式,一種是使用.def檔案匯出,另一種是在程式碼中使用巨集__declspec(dllexport)匯出,最後一種是配置vc工程的屬性,使用LINK 命令中的 /EXPORT 規範

一,使用.def檔案匯出

模組定義 (.def) 檔案是包含一個或多個描述 DLL 各種特性的 Module 語句的文字檔案。
.def 檔案必須至少包含下列模組定義語句:
1,檔案中的第一個語句必須是 LIBRARY 語句。 此語句將 .def 檔案標識為屬於 DLL。 LIBRARY 語句的後面是 DLL 的名稱。 連結器將此名稱放到 DLL 的匯入庫中。
2,EXPORTS 語句列出名稱,可能的話還會列出 DLL 匯出函式的序號值。 通過在函式名的後面加上 @ 符和一個數字,給函式分配序號值。 當指定序號值時,序號值的範圍必須是從 1 到 N,其中 N 是 DLL 匯出函式的個數。

步驟:

我們先建立一個win32控制檯工程,然後在工程目錄下新增.h和.cpp檔案,內容如下:

//dll_export.h
extern int global_value;
int getTestDllValue();
//dll_export.cpp
int global_value = 255;
int getTestDllValue()
{
    return
128; }

然後新建一個.def檔案,放到工程目錄下,命名為def_dll_export.def,內容如下(這裡對.def的註釋非常疑惑,如下的註釋,在使用該dll時居然得不到global_value的值,把註釋去掉就可以拿到值了。。。但是看msdn文件,這樣註釋又是沒有問題的,保險起見,我還是不加註釋了。。

LIBRARY def_dll_export.dll
EXPORTS 
;此處匯出的是函式
getTestDllValue
;匯出資料要指定DATA關鍵字
global_value DATA

然後將.def檔案加入到工程中,在屬性頁中進行如下配置

這裡寫圖片描述

因為我們是生成dll,所以還要進行如下修改

這裡寫圖片描述

然後編譯執行,成功後,在debug/release目錄可以找到生成的dll和lib檔案,然後我們就可以拿去用了。

二,使用巨集__declspec(dllexport)匯出

未完待續

未完待續

如何使用dll

在程式中呼叫dll中的函式有兩種方式,一種是通過lib檔案給出的函式地址從dll中呼叫,另一種是直接通過函式名呼叫dll中的函式。

一,使用.lib和.h

首先將匯出dll時使用的標頭檔案,生成的lib庫檔案和dll檔案放到工程目錄下,並把標頭檔案加入到工程中,然後在呼叫時加入類似下面的程式碼

#include "dll_export.h"
#pragma comment(lib, "def_dll_export.lib");

注意,lib的相對路徑要配置好。然後就可以呼叫相關的函數了。

int _tmain(int argc, _TCHAR* argv[])
{
    int i = getTestDllValue();
    printf("%d", i);
    return 0;
}

二,直接呼叫dll函式

關於操作dll相關的函式我們可以查閱msdn的文件,連結
這裡我只用到三個函式,分別是LoadLibrary(),GetProcAddress(),FreeLibrary(),函式的意義在名字上體現的很好了,不多說了,說下用法,如下

#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //載入dll,注意相對路徑
    auto dllFunc = LoadLibrary(_T("def_dll_export.dll"));
    if (dllFunc)
    {
        //宣告函式指標,和匯出dll時標頭檔案中函式型別一致
        typedef int (*myfunc)();
        myfunc pMyFunc;
        //通過函式名獲取函式在dll中的地址
        pMyFunc = (myfunc)GetProcAddress(dllFunc, "getTestDllValue");
        if (pMyFunc != NULL)
        {
            //呼叫函式
            int j = pMyFunc();
            printf("value:%d", j);
        }
        //釋放對dll的引用
        FreeLibrary(dllFunc);
    }

    return 0;
}