1. exe載入多個dll時,初始化可能會比較慢
2. exe載入老版本dll時,如果沒有相應的匯出函式,exe可以做相應處理後繼續執行。
侷限性1)匯出全域性變數不能延遲。
2)kernel32.dll 不能延遲, loadlibrary and getprocaddress
3) 不能在dllmain中呼叫延遲載入的函式。
onedll.dll project
#ifdef onedll_exports
#define onedll_api __declspec(dllexport)
#else
#define onedll_api __declspec(dllimport)
#endif
extern "c" onedll_api int fnlib(void);
extern "c" onedll_api int fnlib2(void);
#include "onedll.h"
onedll_api int fnlib(void)
onedll_api int fnlib2(void)
oneexe.exe project
#include
#include
#include
#include
#include
#include // for error handling & advanced features
#include "..\onedll.h"
#pragma comment(lib, "onedll.lib")
#pragma comment(lib, "delayimp.lib")
// note: it is not possible to use #pragma comment(linker, "")
// for /delayload and /delay
// forward function prototype
long winapi delayloaddllexceptionfilter(pexception_pointers pep);
///void ismoduleloaded(pctstr pszmodulename)
//int winapi _tmain(hinstance hinstexe, hinstance, ptstr pszcmdline, int)
int _tmain(int argc, _tchar* argv)
__except (delayloaddllexceptionfilter(getexceptioninformation()))
// more code can go here...
return(0);
}///
long winapi delayloaddllexceptionfilter(pexception_pointers pep) ;
switch (pep->exceptionrecord->exceptioncode) else
break;
default:
// we don't recognize this exception
ldisposition = exception_continue_search;
break;
}if (ldisposition == exception_execute_handler)
return(ldisposition);
}// skeleton dlihook function that does nothing interesting
farproc winapi dlihook(unsigned dlinotify, pdelayloadinfo pdli)
return(fp);
}// tell __delayloadhelper2 to call my hook function
pfndlihook __pfndlinotifyhook2 = dlihook;
pfndlihook __pfndlifailurehook2 = dlihook;
//note:
生成exe後,可以rename onedll.dll 名字,或者 delete 某個匯出函式 測試, dependency walker 檢視延遲載入的dll圖示
1.乙個dll中申請、釋放記憶體
2.hkey_local_machine\system\currentcontrolset\control\session manager 可修改引導程式的搜尋順序
3. 隱式載入,可執行程式包含匯出dll工程的標頭檔案,其__declspec(dllimport) 比我們不include標頭檔案而直接用extern 效果高
hmodule winapi getmodulehandle(__in_opt lpctstr lpmodulename);
傳null,返回可執行檔案的控制代碼,傳dll,返回dll例項控制代碼
dword winapi getmodulefilename(__in_opt hmodule hmodule, __out lptstr lpfilename, __in dword nsize);
傳null,返回可執行檔案的名字,傳dll,返回dll名字
dllmain的序列貨呼叫,系統保證乙個執行緒執行完dllmain才會讓另乙個執行緒執行
_dllmaincrtstartup -> __dllmaincrtstartup --> _crt_init, dllmain
_dllmaincrtstartup -> __dllmaincrtstartup --> dllmain, _crt_init
如果使用者不新增dllmain函式,將呼叫c/c++執行庫提供的下面函式
bool winapi dllmain(
handle hdllhandle,
dword dwreason,
lpvoid lpreserved
)
延時載入(lazy load)
1.什麼是延時載入?相關背景 當專案中的頁面需要載入大量的時,如果不進行相關的優化處理,顯然頁面的效能和對使用者的體驗是非常不友好的。如果3s還沒有載入完成,使用者很可能直接關掉你的頁面。優化的方式有很多,首先從源頭來講,可以對載入的資訊進行優化處理,精簡減少冗餘。和 延時載入。定義 延時載入 即 ...
Mybatis延時載入
一 什麼是延遲載入 resultmap可實現高階對映 使用association collection實現一對一及一對多對映 association collection具備延遲載入功能。需求 如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查詢使用者...
靜態載入dll和動態載入dll
一,首先編寫dll 建win32空dll工程 標頭檔案.h extern c declspec dllexport int max int a,int b extern c 解決函式名由於不同編譯器造成的名字匹配問題,通常c 編譯器編譯時會對函式進行改名,而c編譯器不會 extern c decls...