iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
Software Development

闖入DLL的世界 DLL我要進來了哦系列 第 6

第六天:嘗試「動態」調用動態連結函式庫

  • 分享至 

  • xImage
  •  

大家好我是Andy,歡迎各位來到第六天,明天又要開始上班上課了,假日還要補班天啊想玩又想休息但是又要學習,人篸真苦,好吧我們話不多說直接進到今天的學習筆記。


首先我們來回顧一下靜態調用函式庫是怎麼運行的?是利用在exe輸出前使用連結器對dll連結,讓exe可以調用dll的函式,而動態調用函式庫呢?則是在運行時連接的,那話不多說我們進入程式碼。

DIY

#include <windows.h>

/*靜態調用函式庫
#pragma comment(lib,"Dll5")
extern "C" void ccc();
int main(){
	HWND window;
	window = FindWindow(NULL, "Debug");
	SendMessage(window, WM_CLOSE, 0, 0);
	ccc();
	}
*/

typedef void (*ccc)();//dll假設寫ccc(int)後面也要()也要加int
int main()
{
	HMODULE Hmodule = LoadLibrary("Dll5.dll");

	if (Hmodule == NULL) {
		MessageBox(NULL, "沒有抓到Dll", "標題", MB_OK);
		return -1;
	}

	ccc a=(ccc)GetProcAddress(Hmodule, "ccc");

	a();
	
}

如果使用動態調用動態函式庫的話我們首先要有一個指針指向dll裡面的函式,而這項工作我們就是使用typedef void(*ccc)()記住因為式指針所以前面一定要有一個 * 字號
HMODULE Hmodule = LoadLibrary("Dll5.dll"); 這行又是做甚麼的呢,這是幫助我們取得Dll的一個句柄,句柄又是甚麼東西?簡單來說就是他使用的時候系統分發一個ID給他,而我們使用這個ID可以去進行索引
之後建置成功了也可以將exe和dll移到另一個資料夾試試看

重點整理

  • HMODULE
    前面有介紹了HWND是對windows視窗控制的代碼,而這裡的HMODULE是一個模組的地址在記憶體裡
  • typedef void (* 函數)(變數);
    使用動態調用的話必須有個指針指向dll裡面,所以在程式的尾部
    ccc a=(ccc)GetProcAddress(Hmodule, "ccc");
    是使用GetProcAddress導出句柄中ccc函數的地址

結語

今天嘗試了動態調用函式庫,打完有點累趕快洗洗睡,最近都恍神恍神的,如果有錯的地方我想到我會第一時間更新文章,不能讓各位學到錯的東西啊請收下我的膝蓋,還請各位見諒,接下來我們就明天見了。


上一篇
第五天:lib連結?斷開鎖鏈?不,今天是調用dll「靜態」
下一篇
第七天:要用甚麼觀察dll呢?顯微鏡?
系列文
闖入DLL的世界 DLL我要進來了哦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言