DLL 延時載入

2021-06-28 18:34:02 字數 2985 閱讀 7466

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...