全方位解讀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編譯
- C++編寫DLL的方法C++
- 批處理檔案(bat檔案)註冊dll批量註冊dllBAT
- dll檔案是什麼 dll檔案用什麼軟體開啟
- dll檔案刪除不了
- windows下如何使用QT編寫dll程式WindowsQT
- 使用Delphi呼叫C++編寫的DLLC++
- C#呼叫c++編寫的dllC#C++
- 用QT在Windows下編寫dll程式QTWindows
- win10系統dll檔案一鍵修復 缺少dll檔案修復方法Win10
- 讓SQL Server呼叫DLL檔案的方法詳解SQLServer
- 為Linux 應用程式編寫 DLL(轉)Linux
- win10怎麼刪除dll檔案_win10dll檔案刪除的方法Win10
- oci.dll 檔案正在被使用
- .dll,.lib,.def 和 .exp檔案
- 在ASP檔案中呼叫DLL (轉)
- DLL檔案中Form的使用 (轉)ORM
- WINDWOS 系統程式DLL檔案注入。
- ildasm、ilasm修改、反編譯 已經編譯的 dll檔案(c#)LDAASM編譯C#
- 使用ilasm 和 ildasm編譯和反編譯工具對DLL檔案修改ASMLDA編譯
- win10如何註冊dll檔案_win10系統dll檔案怎樣安裝Win10
- 電腦丟失dll檔案一鍵修復 win10缺少dll檔案怎麼辦Win10
- asp.net網頁中呼叫c#寫的dll檔案ASP.NET網頁C#
- DLL庫的編寫(匯出、匯入)與使用
- 使用Reflector和Filedisassembler逆向編譯反編譯.cs.dll檔案程式碼編譯
- java中呼叫dll檔案的步驟Java
- JAVA呼叫C語言下的DLL檔案JavaC語言
- win10 64位怎麼安裝dll檔案_win10系統如何安裝dll檔案Win10
- C#呼叫匯編dllC#
- DLL Basics - DLL基礎
- dll和so檔案區別與構成
- 使用DLL檔案中封裝的視窗 (轉)封裝
- windows XP下丟失hal.dll檔案?Windows
- DLL檔案在Delphi的建立及呼叫 (轉)
- win10強制刪除dll檔案的解決方法Win10
- Xamarin.Android編譯提示找不到mscorlib.dll.so檔案Android編譯
- win10缺失dll檔案怎麼修復 win10一鍵修復dll缺失Win10
- 奇怪的DLL檔案解決安裝Windows2000(轉)Windows