中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

C++DLL怎么導出

本篇內容介紹了“C++ DLL怎么導出”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

成都創新互聯公司是一家專注于成都網站制作、成都網站建設、外貿營銷網站建設與策劃設計,沛縣網站建設哪家好?成都創新互聯公司做網站,專注于網站建設10年,網設計領域的專業建站公司;建站業務涵蓋:沛縣等地區。沛縣做網站價格咨詢:13518219792

通常項目中導出 DLL 接口有兩種方式:

1. __declspec(dllexport) 導出;

2.*.def 文件導出。

__declspec(dllexport) 導出

在 DLL 導出的函數名稱前使用 _declspec(dllexport) 關鍵字導出函數接口。

test_dll.h
// 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
// 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;
}

def 文件導出

由于  __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 文件至工程

C++ DLL怎么導出

3.設置工程屬性

在 “屬性”->“鏈接器”->“輸入” 配置 模塊定義文件 輸入 def文件 名稱。 

C++ DLL怎么導出

4.編譯生成 DLL
使用工具查看導出函數名接口,導出接口的順序與 def文件 定義的序號相同。

C++ DLL怎么導出

存在問題

  • 通過工具可以查看導出函數名,暴露接口函數功能。

  • 導出的函數名可以任意被訪問和使用,即使業務功能被封裝在內部代碼經過加密處理,但外部接口是公開的,可以被正常調用。造成在不知情,被未經授權的開發者濫用,間接造成損失。

解決方案:導出匿名接口

導出匿名序號接口

匿名導出接口只需要在 def文件 的導出接口名稱增加 NONAME 關鍵字即可,如下:

test_dll.def

LIBRARY test_dll
EXPORTS
    add        @1        NONAME
    sub        @2        NONAME
  • NONAME 表示不導出函數名稱(匿名)。

使用 CFF Explorer 工具查看導出函數接口名稱,函數名稱已經被隱藏掉。

C++ DLL怎么導出

訪問匿名序號接口

靜態鏈接

和通常工程引用 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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 成人午夜影视全部免费看 | youjizz日韩| 欧美激情精品久久久久久久久久 | 国产成人综合高清在线观看 | 国产美女一级毛片 | 亚洲一区二区三区四区在线观看 | 在线观看一区二区三区四区 | 欧美另类视频一区二区三区 | 成人自拍小视频 | 啪视| 成人免费一级在线播放 | 亚洲欧美在线精品一区二区 | 欧美日韩高清不卡一区二区三区 | 亚洲精品字幕一区二区三区 | 毛片在线免费视频 | 99精品视频在线观看免费 | 女人张开腿让男人桶视频 | 国产成人丝袜视频在线视频 | 99视频在线观看免费 | 欧美韩国日本 | 国产视频日韩 | 亚洲在线网站 | 成人网免费看 | 免费午夜扒丝袜www在线看 | 久久在线国产 | 99精品小视频 | 欧美日韩一区二区三区在线观看 | 黄色aaaa| 亚洲欧美日韩一级特黄在线 | 91精品国产乱码久久久久久 | 日本久久一区二区 | 国产精品无圣光一区二区 | 美女网站色免费 | 日本韩国中文字幕 | 美女黄色在线网站大全 | 久久r视频 | 欧美在线观看a | 在线免费成人 | 免费看欧美xxx片 | 午夜伦y4480影院中文字幕 | 中文字幕国产欧美 |