Vc 製作通用dll動態鏈結庫並呼叫

2021-08-23 12:30:21 字數 2591 閱讀 5613

step1

檔案-新建-vc+±win32-dll

step2

標頭檔案宣告省略,

匯出函式 只要標頭檔案就可以了不需要原始檔中

cpp原始碼:

#include "stdafx.h"

#include "mydll.h"

//使用c的匯出方式 winapi 使用的呼叫規則也是__stdcall 還要在 def 檔案宣告匯出函式

extern "c" mydll_api int _stdcall getmaxnumber(int a, int b)

extern "c" mydll_api void _stdcall showmsg(char * text, char* title)

mydll_api 是 define mydll_api __declspec(dllexport)這樣其他語言還不能用,還要原始檔-新增.def 宣告匯出函式library

exports

getmaxnumber @ 1

showmsg @ 2

library 後面可以跟輸出的dll名字

@後面的是匯出函式的序號 比如1 就是第乙個

方式二,不使用標準的dll 使用mfc的dll

使用mfc的dll匯出dll非常簡單,

第一種使用c的方式匯出 不需要註明呼叫方式

第二種直接在.def中寫匯出函式和上面一樣

extern "c" __declspec(dllexport) void netbios() //mfc dll 匯出函式和 32dll不一樣不需要 註明呼叫方式

我在查閱書籍的時候發現了另外一種的匯出函式的方式:#pragma comment(linker,"/export:要匯出的名字=實際匯出的名字");

引數一:要匯出的名字,比如我要匯出乙個名字為:myfunction的方法,

引數二:實際匯出的函式。我們知道使用c++或者c+的方式預設 呼叫模式的都會改變函式名字 比如_@myfuntion@0這樣的那就是這個

不論是c還是c++匯出名字的亂碼都是有可以理解的意義並不是真的亂碼。

使用這種方法匯出的函式是兩個而不是乙個

如圖:

extern mydllexport_api int nmydllexport;

#pragma comment(linker,"/export:fn=?fnmydllexport1@@yahxz")

mydllexport_api int fnmydllexport1(void);

這個方法還可以用於**,比如自己要匯出的函式不在自己的dll中,自己的dll只是乙個介面 實際實現是在別的dll中,

#pragma comment(linker,"/export:匯出的介面名字=實現模組名字.名字 ");例子如下

呼叫dll這裡只講一種呼叫方式,可以呼叫所有標準的dll,也叫動態呼叫。

1.使用loadlibrary載入動態庫獲得記憶體位址

2.getprocaddress獲得需要呼叫的函式位址

3.宣告乙個指標來接收2的位址

4.使用指標呼叫

5.釋放

hmodule hdll = loadlibrary(l"c:\\users\\administrator\\desktop\\12.dll"); // 載入動態庫

typedef void(winapi *csayhi) (); //定義乙個無返回值 指向空引數方法的指標

csayhi say = (csayhi)getprocaddress(hdll, "sayhello");

say();

freelibrary(hdll);//釋放dll

總結:1.使用標準的的方式匯出函式名稱必須 註明呼叫方式 def中寫明匯出符號和順序(生成的dll比較小)

2.使用mfcdll匯出函式比較簡單只需要在def中寫名匯出符號,或者使用c的方式匯出不需要寫明呼叫方式(這種方式的生成的dll體積比方式1生成的dll體積大非常多,這也是為什麼那麼多人不愛用mfc的原因)

3.這種方式使用過

聊天交友/修仙練級群:709332479

VC 動態鏈結庫 DLL 程式設計

vc 動態鏈結庫 dll 程式設計 一 理解庫 vc 動態鏈結庫 dll 程式設計 二 非mfc dll vc 動態鏈結庫 dll 程式設計 三 mfc規則dll vc 動態鏈結庫 dll 程式設計 四 mfc擴充套件 dll vc 動態鏈結庫 dll 程式設計 五 dll典型例項 動態鏈結庫 dl...

Delphi 製作 dll 動態鏈結庫

delphi 製作 dll 動態鏈結庫,封裝常用的函式。1,建立 dll 檔案 建立工程 檔案 mydll.dpr library mydll uses sysutils,classes,graphics,controls,forms,dialogs,stdctrls procedure mymsg...

用VC建立DLL動態鏈結庫

1.1 建立dll專案 1.2 為dll專案編寫原始檔 標頭檔案dlldemo.h extern c declspec dllexport int sum int a,int b 加法函式。extern c declspec dllexport int max int a,int b 取較大值函式 ...