通過對函式前加字首:__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 又把本可集中儲存的程序資料結構也拆分成好幾個物件,有的在系統...