vc中dll匯出匯入簡單教程
阿新 • • 發佈:2019-01-31
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)匯出
未完待續
三,使用LINK 命令中的 /EXPORT 規範
未完待續
如何使用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;
}