本篇內容介紹了“C++ DLL怎么導出”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
成都創新互聯公司是一家專注于成都網站制作、成都網站建設、外貿營銷網站建設與策劃設計,沛縣網站建設哪家好?成都創新互聯公司做網站,專注于網站建設10年,網設計領域的專業建站公司;建站業務涵蓋:沛縣等地區。沛縣做網站價格咨詢:13518219792
通常項目中導出 DLL 接口有兩種方式:
1. __declspec(dllexport)
導出;
2.*.def
文件導出。
在 DLL 導出的函數名稱前使用 _declspec(dllexport)
關鍵字導出函數接口。
// 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)
導出接口需要定義一長串的內容,所以 MS 引入 def文件
來導出函數接口。
使用 def文件
相對簡單,只需要在項目中增加一個后綴名為 .def 的文件,按照格式將 DLL 需要導出的接口定義在 def 文件即可。
1.定義 .def 文件
test_dll.def
LIBRARY test_dll EXPORTS add @1 sub @2
DllName
表示 Dll 的文件名
@1
[可選] 指定導出的函數序號。導出多個函數時,需要開發者自定義序號,不能重復。
2.添加 def 文件至工程
3.設置工程屬性
在 “屬性”->“鏈接器”->“輸入” 配置 模塊定義文件
輸入 def文件
名稱。
4.編譯生成 DLL
使用工具查看導出函數名接口,導出接口的順序與 def文件
定義的序號相同。
通過工具可以查看導出函數名,暴露接口函數功能。
導出的函數名可以任意被訪問和使用,即使業務功能被封裝在內部代碼經過加密處理,但外部接口是公開的,可以被正常調用。造成在不知情,被未經授權的開發者濫用,間接造成損失。
匿名導出接口只需要在 def文件
的導出接口名稱增加 NONAME
關鍵字即可,如下:
test_dll.def
LIBRARY test_dll EXPORTS add @1 NONAME sub @2 NONAME
NONAME
表示不導出函數名稱(匿名)。
使用 CFF Explorer
工具查看導出函數接口名稱,函數名稱已經被隱藏掉。
和通常工程引用 DLL 的方法相同,引用 .h
,鏈接 .lib
,運行前將 .dll
文件拷貝至應用運行目錄即可。
通過動態加載的方式調用DLL接口。
當導出序號時,定義函數指針變得復雜,只能通過靜態反編譯的方式確定參數數量和類型,定義函數指針。
#include <Windows.h> // 定義函數指針 typedef int (*func_ptr)(int, int); int dynamic_load_dll() { // 動態加載 DLL 文件 HINSTANCE hDll = LoadLibrary("test_dll.dll"); // 定義函數指針變量 func_ptr add_ptr, sub_ptr; if(hDll){ add_ptr = (func_ptr)GetProcAddress(hDll, (LPCSTR)1); // 根據導出序號加載函數(add) sub_ptr = (func_ptr)GetProcAddress(hDll, (LPCSTR)2); // 根據導出需要加載函數(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; }
注意:定義函數指針的類型聲明必須與函數定義一致,否則無法正常使用。
“C++ DLL怎么導出”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!
新聞標題:C++DLL怎么導出
鏈接分享:http://m.2m8n56k.cn/article2/jdshoc.html
成都網站建設公司_創新互聯,為您提供網站營銷、外貿網站建設、小程序開發、商城網站、網站導航、定制網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯