本篇內(nèi)容介紹了“C++ DLL怎么導(dǎo)出”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),沛縣網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:沛縣等地區(qū)。沛縣做網(wǎng)站價(jià)格咨詢:13518219792
通常項(xiàng)目中導(dǎo)出 DLL 接口有兩種方式:
1. __declspec(dllexport)
導(dǎo)出;
2.*.def
文件導(dǎo)出。
在 DLL 導(dǎo)出的函數(shù)名稱前使用 _declspec(dllexport)
關(guān)鍵字導(dǎo)出函數(shù)接口。
// test_dll.h #ifdef __cplusplus extern "C" { #endif #ifdef DLL_EXPORT #else #define DLL_EXPORT _declspec(dllexport) #endif DLL_EXPORT int add(int a, int b); DLL_EXPORT int sub(int a, int b); #ifdef __cplusplus } #endif
// test_dll.cpp #include "test_dll.h" int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; }
由于 __declspec(dllexport)
導(dǎo)出接口需要定義一長(zhǎng)串的內(nèi)容,所以 MS 引入 def文件
來(lái)導(dǎo)出函數(shù)接口。
使用 def文件
相對(duì)簡(jiǎn)單,只需要在項(xiàng)目中增加一個(gè)后綴名為 .def 的文件,按照格式將 DLL 需要導(dǎo)出的接口定義在 def 文件即可。
1.定義 .def 文件
test_dll.def
LIBRARY test_dll EXPORTS add @1 sub @2
DllName
表示 Dll 的文件名
@1
[可選] 指定導(dǎo)出的函數(shù)序號(hào)。導(dǎo)出多個(gè)函數(shù)時(shí),需要開(kāi)發(fā)者自定義序號(hào),不能重復(fù)。
2.添加 def 文件至工程
3.設(shè)置工程屬性
在 “屬性”->“鏈接器”->“輸入” 配置 模塊定義文件
輸入 def文件
名稱。
4.編譯生成 DLL
使用工具查看導(dǎo)出函數(shù)名接口,導(dǎo)出接口的順序與 def文件
定義的序號(hào)相同。
通過(guò)工具可以查看導(dǎo)出函數(shù)名,暴露接口函數(shù)功能。
導(dǎo)出的函數(shù)名可以任意被訪問(wèn)和使用,即使業(yè)務(wù)功能被封裝在內(nèi)部代碼經(jīng)過(guò)加密處理,但外部接口是公開(kāi)的,可以被正常調(diào)用。造成在不知情,被未經(jīng)授權(quán)的開(kāi)發(fā)者濫用,間接造成損失。
匿名導(dǎo)出接口只需要在 def文件
的導(dǎo)出接口名稱增加 NONAME
關(guān)鍵字即可,如下:
test_dll.def
LIBRARY test_dll EXPORTS add @1 NONAME sub @2 NONAME
NONAME
表示不導(dǎo)出函數(shù)名稱(匿名)。
使用 CFF Explorer
工具查看導(dǎo)出函數(shù)接口名稱,函數(shù)名稱已經(jīng)被隱藏掉。
和通常工程引用 DLL 的方法相同,引用 .h
,鏈接 .lib
,運(yùn)行前將 .dll
文件拷貝至應(yīng)用運(yùn)行目錄即可。
通過(guò)動(dòng)態(tài)加載的方式調(diào)用DLL接口。
當(dāng)導(dǎo)出序號(hào)時(shí),定義函數(shù)指針變得復(fù)雜,只能通過(guò)靜態(tài)反編譯的方式確定參數(shù)數(shù)量和類型,定義函數(shù)指針。
#include// 定義函數(shù)指針 typedef int (*func_ptr)(int, int); int dynamic_load_dll() { // 動(dòng)態(tài)加載 DLL 文件 HINSTANCE hDll = LoadLibrary("test_dll.dll"); // 定義函數(shù)指針變量 func_ptr add_ptr, sub_ptr; if(hDll){ add_ptr = (func_ptr)GetProcAddress(hDll, (LPCSTR)1); // 根據(jù)導(dǎo)出序號(hào)加載函數(shù)(add) sub_ptr = (func_ptr)GetProcAddress(hDll, (LPCSTR)2); // 根據(jù)導(dǎo)出需要加載函數(shù)(sub) }else{ printf("Load DLL failed!\n"); return 1; } if (add_ptr) { printf("%d\n", add_ptr(11, 4)); } else { printf("GetProcAddress add function failed!\n"); return 1; } if (sub_ptr) { printf("%d\n", sub_ptr(21, 4)); } else { printf("GetProcAddress sub function failed!\n"); return 1; } return 0; }
注意:定義函數(shù)指針的類型聲明必須與函數(shù)定義一致,否則無(wú)法正常使用。
“C++ DLL怎么導(dǎo)出”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!