Windows DLL的生成與使用

2021-09-24 13:08:21 字數 1844 閱讀 3691

通過對函式前加字首:__declspec(dllexport) 或__declspec(dllimport),表明函式或類是匯出到dll,還是從dll中匯入。但在c++中,通過編譯會改變函式名稱,可以通過如下的巨集進行更正,但過程比較繁瑣,不適用於大批量改變函式名稱的情況。

#pragma comment(linker, "export:myfun=myfun@8"
為了解決這個問題,可以通過另外的兩種辦法:

新增 extern "c"標識,如下文**示例所示。

在.def檔案中進行定義

void extern "c" __declspec(dllexport) funcname()

1. 相對虛擬位址

編譯後生成的dll,將函式放在了各自相對應的偏移位址上,包括變數等資訊的位址。

2. 構建可執行模組

通過dumpbin程式,可以檢視到函式的匯入情況:dumpbin -imports calc.exe

3. 執行可執行模組

需要執行可執行模組,需要檢視模組所需要的dll,但又是按照什麼規則進行查詢和載入的呢?規則如下:

可執行檔案目錄

windows系統目錄——getsystemdirectory可以獲得

windows目錄——getwindowdirectory可以獲得

程序當前目錄(防止偽造的windows dll,故在windows目錄後)

path環境變數中的目錄

這個只是微軟預先配置好的搜尋路徑,若需要按照自定義的,需要修改登錄檔中對應的內容。

dll載入方式有兩種,一種是隱式,另一種為顯式。

隱式:

#pragma comment(lib,"*.lib")
顯式:

有以下兩個函式loadlibrary和loadlibraryex。其中帶ex可以附帶屬性控制,大致有如下幾個功能:

1dont_resolve_dll_referrences

1. 不適用dllmain初始化

2. 不載入依賴

2load_library_as_datafile_exclusive

dll是否獨佔方式開啟

3load_livrary_as_datafile

是否按照資源檔案匯入

4load_with_altered_search_path

自定義dll搜尋路徑等

5load_library_as_image_resource

虛擬位址修復

更詳細的介紹可以見此位址:

hmodule loadlibrarya(

lpcstr lplibfilename

);hmodule loadlibraryexa(

lpcstr lplibfilename,

handle hfile,

dword dwflags

);

farproc getprocaddress(

hmodule hmodule,

lpcstr lpprocname

);

載入的dll資源的**:

bool freelibrary(

hmodule hlibmodule

);

通過dll的方式,可以很方便的進行開發工作,將功能相近的封裝到一起,在一定程度上可以方便軟體規模的管理。同時,dll載入方式決定了軟體啟動速度,通過只初始化必要的元件,來加快啟動,並在後期需要呼叫一些功能的時候再進行選擇性的載入。

Linux crash dump檔案生成與使用

不像windows程式需手動呼叫相關函式,linux程式crash dump 稱為core dump 檔案會在程式崩潰 如sigsegv 時自動生成,只需要在之前設定了乙個引數即可 當然,windows的方式能夠支援更靈活的功能。生成 1,使用ulimit c unlimited設定引數 unlim...

gulp生成資源路徑(gulp edit的使用)

專案中因為引入了lazyload做懶載入,就需要配置一些常量來放置資源的路徑 如下圖 之前都是手填的,易錯且麻煩,既然專案中引入了gulp就要利用起來。通過gulp inject可以篩選出專案路徑,並且以陣列的形式插入到目標位置,在用gulp edit來編輯這個陣列,就能以key value的形式插...

Windows DLL在目標程序中的描述(1)

linux 上每乙個程序都有乙個程序控制塊,與程序或執行緒有關的資訊大都儲存在這個資料結構中。而 windows 則有所不同。首先 windows 的程序和執行緒各有不同的資料結構來描述,從概念上把程序和執行緒分離開。其次,windows 又把本可集中儲存的程序資料結構也拆分成好幾個物件,有的在系統...