全方位解讀DLL檔案—編寫DLL
前情提要
dll 的編寫特別要注意你的編譯器選擇,我目前也只用了兩個主流的編譯器做過測試,一個是微軟 VisualStudio 自帶的 MSVC編譯器
,另一個是 GNU 在 Windows 上的 MinGW編譯器
如果你使用 MinGW,那麼和寫普通程式區別不大;但如果你使用 MSVC 的話,你就需要注意一些固定的格式,以及一些巨集定義
MSVC版
直接新建一個 dll 檔案專案,先寫一個標頭檔案,把一些變數和函式的定義寫好,這裡有興趣的話可以瞭解一下 #ifdef
以及 extern "C" __declspec(dllimport)
,標頭檔案 header.h 程式碼如下
#ifdef MYLIBAPI
#define MYLIBAPI extern "C" __declspec(dllexport)
#else
#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
MYLIBAPI int res;
MYLIBAPI int myadd(int num1,int num2);
然後是主要的功能程式碼,mydll.c 程式碼如下
#include <windows.h>
#define MYLIBAPI extern "C" __declspec(dllimport)
#include "header.h"
int res;
int myadd(int num1,int num2){
res = num1 + num2;
return res;
}
注意事項:extern "C"
主要是排除 C++ 編譯的干擾,C++ 編譯某個函式後會變成 func@ 的形式,不方便主程式根據函式名呼叫__declspec(dllimport)
從其它動態庫中宣告匯入函式、類、物件等供本動態庫或exe檔案使用,在沒有全域性靜態變數時可以不使用該關鍵字__declspec(dllexport)
宣告為匯出函式、類、物件等供其它程式呼叫,如果不使用該關鍵字匯出 dll 函式,則需要 .def 檔案
MinGW版
使用 MinGW 編譯器的話和寫普通程式類似,只寫需要用到的函式即可,不需要 main 主函式,然後編譯成 dll 檔案即可。編譯一句搞定 gcc math.c -shared -o math.dll -Wl,--out-implib,math.lib,--output-def,math.def
,還能生成 .lib 以及 .def 檔案,用 C++ 的話可能還需要 --kill-at
,mydll.c 程式碼如下:
#include<stdio.h>
int add(int a,int b){
return a+b;
}
int sub(int a,int b){
return a-b;
}
int mul(int a,int b){
return a*b;
}
int div(int a,int b){
return a/b;
}
// gcc math.c -shared -o math.dll -Wl,--out-implib,math.lib,--output-def,math.def
注意:
dll 程式其實也是有入口函式的-DllMain,作業系統在呼叫 LoadLibrary() 執行緒的上下文中呼叫此入口函式,並且入口函式中通常會說明該 dll 被呼叫的方式!除非有特殊需求,一般不需要寫 DllMain 函式
END
相關文章
- dll反編譯(修改引用檔案、修改程式碼)再生成dll編譯
- dll檔案是什麼 dll檔案用什麼軟體開啟
- dll檔案刪除不了
- win10系統dll檔案一鍵修復 缺少dll檔案修復方法Win10
- win10怎麼刪除dll檔案_win10dll檔案刪除的方法Win10
- oci.dll 檔案正在被使用
- antixss防禦xss DLL庫檔案
- win10如何註冊dll檔案_win10系統dll檔案怎樣安裝Win10
- 電腦丟失dll檔案一鍵修復 win10缺少dll檔案怎麼辦Win10
- 使用ilasm 和 ildasm編譯和反編譯工具對DLL檔案修改ASMLDA編譯
- JAVA呼叫C語言下的DLL檔案JavaC語言
- 使用 Visual Studio 來除錯 dll 檔案除錯
- java中呼叫dll檔案的步驟Java
- 使用Reflector和Filedisassembler逆向編譯反編譯.cs.dll檔案程式碼編譯
- win10 64位怎麼安裝dll檔案_win10系統如何安裝dll檔案Win10
- 編譯問題解決:LINK : fatal error LNK1104: 無法開啟檔案“*.dll”編譯Error
- WAMP 安裝——缺少檔案(VCRUNTIME140.DLL、API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL、MSVCR110.DLL)API
- win10強制刪除dll檔案的解決方法Win10
- win10缺失dll檔案怎麼修復 win10一鍵修復dll缺失Win10
- Depends.exe檢視dll動態鏈檔案
- win10怎樣強制刪除dll檔案 win10系統強制刪除dll檔案的步驟Win10
- 簡單架構:採集庫dll、檢測演算法dll、專案程式exe,框架庫dll架構演算法框架
- dll預編譯提高webpack打包速度編譯Web
- win10dll檔案找不到入口點如何解決 win10電腦註冊dll檔案總是找不到入口點的解決步驟Win10
- 封裝C專案為dll封裝
- VS 2019 打包安裝檔案 教程 (告訴你為什麼你的是DLL檔案)解決!
- Sql Server 資料庫中呼叫dll檔案的過程SQLServer資料庫
- dll應用在win10環境下怎麼使用_win10系統開啟dll檔案的方法Win10
- CMake 進行多專案中dll的編譯和連結編譯
- win10系統下bootres.dll檔案損壞了怎麼解決Win10boot
- .Net引用根目錄子資料夾下的dll檔案
- 探究:nuget工具對不再使用的dll檔案的處理策略
- 類庫間無專案引用時,在編譯時拷貝DLL編譯
- 實現通過COM元件方式實現java呼叫C#寫的DLL檔案的完整demo元件JavaC#
- 瞭解如何用 Bash 讀寫檔案
- 解決:Could not load dynamic library ‘cudart64_101.dll‘; dlerror: cudart64_101.dll not foundDartError
- 檔案排版(文字檔案讀寫)
- Python搭建呼叫本地dll的Windows服務(瀏覽器可以訪問,附測試dll64位和32位檔案)PythonWindows瀏覽器