微软çVisual C++æ¯æä¸ç§DLLï¼å®ä»¬åå«æ¯Non-MFC Dllï¼éMFCå¨æåºï¼ãRegular
Dllï¼å¸¸è§DLLï¼ãExtension Dllï¼æ©å±DLLï¼ã
Non-MFC
DLLæçæ¯ä¸ç¨MFCçç±»åºç»æï¼ç´æ¥ç¨Cè¯è¨åçDLLï¼å
¶å¯¼åºçå½æ°æ¯æ åçCæ¥å£ï¼è½è¢«éMFCæMFCç¼åçåºç¨ç¨åºæè°ç¨ãRegular
DLL:åä¸è¿°çExtension
Dllsä¸æ ·ï¼æ¯ç¨MFCç±»åºç¼åçï¼å®çä¸ä¸ªææ¾çç¹ç¹æ¯å¨æºæ件éæä¸ä¸ªç»§æ¿CWinAppçç±»ï¼æ³¨æï¼æ¤ç±»DLLè½ç¶ä»CWinAppæ´¾çï¼ä½æ²¡ææ¶æ¯å¾ªç¯ï¼,被导åºçå½æ°æ¯Cå½æ°ãC++ç±»æè
C++æåå½æ°ï¼æ³¨æä¸è¦ææ¯è¯C++ç±»ä¸MFCç微软åºç¡C++ç±»ç¸æ··æ·ï¼ï¼è°ç¨å¸¸è§DLLçåºç¨ç¨åºä¸å¿
æ¯MFCåºç¨ç¨åºï¼åªè¦æ¯è½è°ç¨ç±»Cå½æ°çåºç¨ç¨åºå°±å¯ä»¥ï¼å®ä»¬å¯ä»¥æ¯å¨Visual
C++ãDephiãVisual BasicãBorland
Cçç¼è¯ç¯å¢ä¸å©ç¨DLLå¼ååºç¨ç¨åºã
常è§DLLåå¯ç»åæéæé¾æ¥å°MFCåå¨æé¾æ¥å°MFCä¸çï¼è¿ä¸¤ç§å¸¸è§DLLçåºå«å°å¨ä¸é¢ä»ç»ãä¸å¸¸è§DLLç¸æ¯ï¼ä½¿ç¨æ©å±DLLç¨äºå¯¼åºå¢å¼º
MFCåºç¡ç±»çå½æ°æåç±»ï¼ç¨è¿ç§ç±»åçå¨æé¾æ¥åºï¼å¯ä»¥ç¨æ¥è¾åºä¸ä¸ªä»MFCæ继æ¿ä¸æ¥çç±»ã
æ©å±DLLæ¯ä½¿ç¨MFCçå¨æé¾æ¥çæ¬æå建çï¼å¹¶ä¸å®åªè¢«ç¨MFCç±»åºæç¼åçåºç¨ç¨åºæè°ç¨ãä¾å¦ä½ å·²ç»å建äºä¸ä¸ªä»MFCçCtoolBarç±»çæ´¾çç±»ç¨äºå建ä¸ä¸ªæ°çå·¥å
·æ ï¼ä¸ºäºå¯¼åºè¿ä¸ªç±»ï¼ä½ å¿
é¡»æå®æ¾å°ä¸ä¸ªMFCæ©å±çDLLä¸ãæ©å±DLL
å常è§DLLä¸ä¸æ ·ï¼å®æ²¡æä¸ä¸ªä»CWinApp继æ¿èæ¥çç±»ç对象ï¼æ以ï¼å¼å人åå¿
é¡»å¨DLLä¸çDllMainå½æ°æ·»å åå§å代ç åç»æ代ç ã
1ã DLLçæ¦å¿µ
å¯ä»¥åç¨åºæä¾ä¸äºå½æ°ãåéæ ç±» ã
éæé¾æ¥åºä¸å¨æé¾æ¥åºçåºå«ï¼
ï¼1ï¼éæé¾æ¥åºä¸å¨æé¾æ¥åº é½æ¯å
±äº«ä»£ç çæ¹å¼ ãéæé¾æ¥åºææåçæ令 é½å
å«
å¨æç»çæçEXEæ件ä¸äºï¼å¨æé¾æ¥åºä¸å¿
被å
å«å¨æç»EXEæ件ä¸ï¼EXEæ件 æ§è¡æ¶å¯ä»¥âå¨æâå°å¼ç¨åå¸è½½
è¿ä¸ªä¸EXEç¬ç«çDLLæ件ã
ï¼2ï¼ éæé¾æ¥åºä¸ ä¸è½åå
å«å
¶ä»çå¨æé¾æ¥åºæè
éæåº
ï¼èå¨å¨æé¾æ¥åºä¸è¿å¯ä»¥åå
å«å
¶ä»çå¨ææéæé¾æ¥åºã
DLLåç±»ï¼
1ãNon-MFC
DLLï¼éMFCå¨æåºï¼ï¼ä¸éç¨MFCç±»åºç»æï¼å
¶å¯¼åºå½æ°ä¸ºæ åçCæ¥å£ï¼è½è¢«éMFCæMFCç¼åçåºç¨ç¨åºæè°ç¨ï¼
2ãMFC Regular DLLï¼MFCè§åDLLï¼ï¼éMFCå¨æåºMFCè§åDLL
å
å«ä¸ä¸ªç»§æ¿èªCWinAppçç±»ï¼ä½å
¶æ æ¶æ¯å¾ªç¯ï¼
3ãMFC Extension DLLï¼MFCæ©å±DLLï¼ï¼éç¨MFCçå¨æé¾æ¥çæ¬å建ï¼å®
åªè½è¢«ç¨MFCç±»åºæç¼åçåºç¨ç¨åºæè°ç¨ã
2ã å建ä¸ä¸ªDLL
2.1 éMFCçDLL
2.1.1声æ导åºå½æ°ï¼
extern âCâ __declspec(dllexport) int add(int a, int b);
å
¶ä¸ extern
âCâ为声æ为Cç¼è¯ãç±äºC++ç¼è¯å¨å¨ç¼è¯çæ¶åä¼é æå
¶å½æ°åç该åï¼å¨å
¶ä»åºç¨ç¨åºä¸å¯¼è´å½æ°ä¸å¯è°ç¨ï¼èCç¼è¯å¨åä¸ä¼å¨ç¼è¯åæ¹åå
¶å½æ°åãè¿æ ·å¦æç¨Cç¼è¯çç¨åºæ¥è°ç¨è¯¥dllä¸çå½æ°æ¶ï¼å¯è½ä¼é ææ¾ä¸å°è¯¥å½æ°ã
__declspecï¼dllexportï¼è¡¨ç¤ºè¯¥å½æ°ä¸ºDLLè¾åºå½æ°ï¼å³å
¶ä»åºç¨ç¨åºå¯ä»¥è°ç¨è¯¥å½æ°
ä»dllä¸å£°æè¾åºå½æ°æ两ç§æ¹å¼ï¼
ï¼1ï¼ å¦å¤ä¸ç§æ¹å¼æ¯éç¨æ¨¡åå®ä¹(.def)
æ件声æï¼.defæ件为é¾æ¥å¨æä¾äºæå
³è¢«é¾æ¥ç¨åºç导åºãå±æ§åå
¶ä»æ¹é¢çä¿¡æ¯ã
ï¼2ï¼ ç¨__declspec(dllexport)æ¥å£°æå½æ°
å¦æ使ç¨Visual
C++æ¥å建dllï¼å¯¹äºåæ ·ç¨VCå建çexeæ¥è¯´ï¼è°ç¨dll没æä»ä¹é®é¢ãèå¦æç¨å
¶ä»å·¥å
·æ¥å建çexeæ¥è°ç¨dllï¼å°±ä¼åºç°é®é¢ãå 为å³ä½¿ä½ ä¸ç¨C++ç¼è¯å¨ï¼Microsoft
Cç¼è¯å¨ä¹ä¼æ害Cå½æ°ãå½ç¨__stdcallå°å½æ°è¾åºæ¶ï¼Cç¼è¯å¨ä¼å°å½æ°æ¹ä¸º_func@1çå½¢å¼ãå¨è¿ééè¦å¨.defæ件ä¸å å
¥EXPORTSèæ¥è¾åºå½æ°ï¼
EXPORTS
func
è¿æ ·ï¼dllå°ç¨funcå½æ°åæ¥è¾åºå½æ°ã
å¦ä¸ç§æ¹å¼æ¯ç¨#pragma (linker,
â/exports:func=_func@1â),åè¯ç¼è¯å¨è¾åºå½æ°funcï¼è¿ç§æ¹å¼æ²¡æåä¸ç§å¥½ã
å¦æéè¿VC++ç¼åçDLL欲被å
¶ä»è¯è¨ç¼åçç¨åºè°ç¨ï¼åºå°å½æ°çè°ç¨æ¹å¼å£°æ为__stdcallæ¹å¼ï¼WINAPIé½éç¨è¿ç§æ¹å¼ï¼èC/C++
缺ççè°ç¨æ¹å¼å´ä¸º__cdeclã__stdcallæ¹å¼ä¸__cdecl对å½æ°åæç»çæ符å·çæ¹å¼ä¸åãè¥éç¨Cç¼è¯æ¹å¼(å¨C++ä¸éå°å½æ°å£°æ为extern
"C")ï¼__stdcallè°ç¨çº¦å®å¨è¾åºå½æ°ååé¢å ä¸å线ï¼åé¢å â@â符å·ååæ°çåèæ°ï¼å½¢å¦_functionname@numberï¼è__cdeclè°ç¨çº¦å®ä»
å¨è¾åºå½æ°ååé¢å ä¸å线ï¼å½¢å¦_functionnameã
; lib.def : 导åºDLLå½æ°
LIBRARY dllTestEXPORTSadd @ 1.defæ件çè§å为ï¼
(1)LIBRARYè¯å¥è¯´æ.defæ件ç¸åºçDLLï¼
(2)EXPORTSè¯å¥åååºè¦å¯¼åºå½æ°çå称ãå¯ä»¥å¨.defæ件ä¸ç导åºå½æ°ååå @nï¼è¡¨ç¤ºè¦å¯¼åºå½æ°çåºå·ä¸ºnï¼å¨è¿è¡å½æ°è°ç¨æ¶ï¼è¿ä¸ªåºå·å°åæ¥å
¶ä½ç¨ï¼ï¼
(3).def æ件ä¸ç注éç±æ¯ä¸ªæ³¨éè¡å¼å§å¤çåå· (;) æå®ï¼ä¸æ³¨éä¸è½ä¸è¯å¥å
±äº«ä¸è¡ã
ç±æ¤å¯ä»¥çåºï¼ä¾åä¸lib.defæ件çå«ä¹ä¸ºçæå为âdllTestâçå¨æé¾æ¥åºï¼å¯¼åºå
¶ä¸çaddå½æ°ï¼å¹¶æå®addå½æ°çåºå·ä¸º1ã2.1.2
Dllçè°ç¨æ¹å¼ï¼
DLLçè°ç¨å为两ç§æ¹å¼ï¼ å¨æåéæ
ï¼1ï¼ å¨æè°ç¨ï¼
typedef int(*lpAddFun)(int, int); //å®å®ä¹å½æ°æéç±»å
lpAddFun add;//å½æ°æé
HINSTANCE hDll= LoadLibrary(âpathâ);
add=(lpAddFun) GetProcAddress (hDll,
"add");//è·å¾dllä¸çaddå½æ°æé
FreeLibrary (hDll);
å¨ä»dllè°ç¨ä¸è¿åçå½æ°ãæéæè
ç±» é½æ¯ä»¥æéçæ¹å¼ ï¼å³è¿åçæ¯å½æ°ãåéæç±»çå°åãè¿éä¸å®è¦æ³¨æï¼
ä¸è½ç®åçç¨å½æ°åæ¥èµå¼ ã
ï¼2ï¼ éæè°ç¨ï¼
å°çæç .dllå.lib æ件æ·å
¥å°è°ç¨dllçå·¥ç¨ä¸ï¼ç¨å½ä»¤
#pragma comment(lib,"dllTest.lib")ï¼å®ç°éæè°ç¨ï¼å³
æ该dllå¨ç¼è¯çæ¶åä¹ç¼è¯å°exeæ件ä¸å» ï¼èåå¨å·¥ç¨ä¸è°ç¨æ¶ç¨ä¸é¢ç代ç ï¼
#pragma comment(lib,"dllTest.lib")
//.libæ件ä¸ä»
ä»
æ¯å
³äºå
¶å¯¹åºDLLæ件ä¸å½æ°çéå®ä½ä¿¡æ¯extern "C"
__declspec(dllimport) add(int x,int y);int main(int argc, char*
argv[]){int result = add(2,3);printf("%d",result);return
0;}ããç±ä¸è¿°ä»£ç å¯ä»¥çåºï¼éæè°ç¨æ¹å¼ç顺å©è¿è¡éè¦å®æ两个å¨ä½ï¼ãã(1)åè¯ç¼è¯å¨ä¸DLLç¸å¯¹åºç.libæ件æå¨ç
è·¯å¾åæ件å ï¼#pragma comment(lib,"dllTest.lib")å°±æ¯èµ·è¿ä¸ªä½ç¨ã
ç¨åºåå¨å»ºç«ä¸ä¸ªDLLæ件æ¶ï¼è¿æ¥å¨ä¼èªå¨ä¸ºå
¶çæä¸ä¸ªå¯¹åºç.libæ件ï¼è¯¥æ件å
å«äºDLL 导åºå½æ°ç
符å·åååºå·ï¼å¹¶ä¸å«æå®é
ç代ç ï¼ãå¨åºç¨ç¨åºéï¼.libæ件å°ä½ä¸ºDLLçæ¿ä»£æ件åä¸ç¼è¯ã
å¦å¤ä¸ç§æ¾å¼è°ç¨çæ¹å¼æ¯è®¾ç½®vcä¸çç®å½åincludefilesæ¥å®ç°
(2) 声æ导å
¥å½æ° ï¼extern "C" __declspec(dllimport) add(int x,int
y)è¯å¥ä¸ç __declspec(dllimport) åæ¥è¿ä¸ªä½ç¨ã
éæè°ç¨æ¹å¼ä¸åéè¦ä½¿ç¨ç³»ç»APIæ¥å è½½ãå¸è½½DLL以åè·åDLLä¸å¯¼åºå½æ°çå°åãè¿æ¯å 为ï¼å½ç¨åºåéè¿éæé¾æ¥æ¹å¼ç¼è¯çæåºç¨ç¨åºæ¶ï¼åºç¨ç¨åºä¸è°ç¨çä¸.libæ件ä¸å¯¼åºç¬¦å·ç¸å¹é
çå½æ°ç¬¦å·å°è¿å
¥å°çæçEXE
æ件ä¸ï¼.libæ件ä¸æå
å«çä¸ä¹å¯¹åºçDLLæ件çæ件åä¹è¢«ç¼è¯å¨åå¨å¨
EXEæ件å
é¨ãå½åºç¨ç¨åºè¿è¡è¿ç¨ä¸éè¦å è½½DLLæ件æ¶ï¼Windowså°æ ¹æ®è¿äºä¿¡æ¯åç°å¹¶å è½½DLLï¼ç¶åéè¿ç¬¦å·åå®ç°å¯¹DLL
å½æ°çå¨æé¾æ¥ãè¿æ ·ï¼EXEå°è½ç´æ¥éè¿å½æ°åè°ç¨DLLçè¾åºå½æ°ï¼å°±è±¡è°ç¨ç¨åºå
é¨çå
¶ä»å½æ°ä¸æ ·ã
2.1.3 DllMainå½æ°
Windowså¨å è½½dllçæ¶åï¼ä¼é¦å
éè¦ä¸ä¸ªå
¥å£å½æ°DllMainãå½å¨dllä¸ä¸å®ä¹DllMainçæ¶åï¼windowsä¼ä»å
¶ä»è¿è¡åºä¸è°ç¨ä¸ä¸ªä¸åä»»ä½æä½çDllMainå½æ°ï¼ç´æ¥è¿åtrueãDllMainæ¯dllå
é¨çå½æ°ï¼è¿æå³çå¨è°ç¨dllçç¨åºä¸ä¸è½æ¾å¼çè°ç¨ãå®æ¯å¨
dll被è°ç¨æ¶èªå¨è¢«è°ç¨çã
BOOL APIENTRY DllMain( HANDLE hModule, DWORD
ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case: DLL_PROCESS_ATTACH:
break;
case: DLL_THREAD_ATTACH:
break;
case: DLL_THREAD_DETACH:
break;
case: DLL_PROCESS_DETACH:
break;
return TRUE;
}
}2.2 å¨dllä¸å¯¼åºåé
1ãå¨dllä¸å®ä¹åé extern int global;
2ãå¨.defä¸å®ä¹è¾åº EXPORTS:
global DATA
3ã å¨åºç¨ç¨åºä¸è°ç¨ï¼#pragma comment(lib,"dllTest.lib")
extern int global;
注æå¨æ¤å¼å
¥çåéglobalï¼æ¯ä¸ä¸ªå°åï¼å¨ä½¿ç¨æ¶éè¦å¼ºå¶è½¬å为æéååç¨ï¼æè½å¾å°å
¶å¼ã
ï¼int *ï¼global=10;
å¨åºç¨å·¥ç¨ä¸å¼ç¨DLLä¸å
¨å±åéçä¸ä¸ªæ´å¥½æ¹æ³æ¯:
extern int _declspec(dllimport) global;
//ç¨_declspec(dllimport)导å
¥
éè¿_declspec(dllimport)æ¹å¼å¯¼å
¥çå°±æ¯DLLä¸å
¨å±åéæ¬èº«èä¸åæ¯å
¶å°åäº,建议å¨ä¸åå¯è½çæ
åµä¸ä½¿ç¨è¿ç§æ¹å¼ã
2.3 dll导åºç±»
å¨å®ä¹çæ¶åç¨ class _declspec(dllexport) classname{
}
å¨ç±»ä¸å¼ç¨çæ¶åç¨
å å
¥ç±»å®ä¹å¤´æ件 ï¼#include âclassname.hâ
Class _declspec(dllimport) classname æ¥å¯¼å
¥ç±»
3ã MFCè§åDll
MFCè§åDLLçæ¦å¿µä½ç°å¨ä¸¤æ¹é¢ï¼
ï¼1ï¼ å®æ¯MFCç
âæ¯MFCçâæå³çå¯ä»¥å¨è¿ç§DLLçå
é¨ä½¿ç¨MFCï¼
ï¼2ï¼ å®æ¯è§åç
âæ¯è§åçâæå³çå®ä¸åäºMFCæ©å±DLLï¼å¨MFCè§åDLLçå
é¨è½ç¶å¯ä»¥ä½¿ç¨MFCï¼ä½æ¯å
¶ä¸åºç¨ç¨åºçæ¥å£ä¸è½æ¯MFCãèMFCæ©å±DLLä¸åºç¨ç¨åºçæ¥å£å¯ä»¥æ¯MFCï¼å¯ä»¥ä»MFCæ©å±DLLä¸å¯¼åºä¸ä¸ªMFCç±»çæ´¾çç±»ã
Regular
DLLè½å¤è¢«æææ¯æDLLææ¯çè¯è¨æç¼åçåºç¨ç¨åºè°ç¨ï¼å½ç¶ä¹å
æ¬ä½¿ç¨MFCçåºç¨ç¨åºãå¨è¿ç§å¨æè¿æ¥åºä¸ï¼å
å«ä¸ä¸ªä»CWinApp继æ¿ä¸æ¥çç±»ï¼DllMainå½æ°åç±MFCèªå¨æä¾ã
ï¼1ï¼éæé¾æ¥å°MFC çè§åDLL
éæé¾æ¥å°MFCçè§åDLLä¸MFCåºï¼å
æ¬MFCæ©å±
DLLï¼éæé¾æ¥ï¼å°MFCåºç代ç ç´æ¥çæå¨.dllæ件ä¸ãå¨è°ç¨è¿ç§DLLçæ¥å£æ¶ï¼MFC使ç¨DLLçèµæºãå æ¤ï¼å¨éæé¾æ¥å°MFC
çè§åDLLä¸ä¸éè¦è¿è¡æ¨¡åç¶æçåæ¢ã
使ç¨è¿ç§æ¹æ³çæçè§åDLLå
¶ç¨åºè¾å¤§ï¼ä¹å¯è½å
å«éå¤ç代ç ã
ï¼2ï¼å¨æé¾æ¥å°MFC çè§åDLL
å¨æé¾æ¥å°MFC çè§åDLL å¯ä»¥å使ç¨å®çå¯æ§è¡æ件åæ¶å¨æé¾æ¥å° MFC DLL åä»»ä½MFCæ©å±
DLLãå¨ä½¿ç¨äºMFCå
±äº«åºçæ¶åï¼é»è®¤æ
åµä¸ï¼MFC使ç¨ä¸»åºç¨ç¨åºçèµæºå¥ææ¥å è½½èµæºæ¨¡æ¿ãè¿æ ·ï¼å½DLLååºç¨ç¨åºä¸åå¨ç¸åIDçèµæºæ¶ï¼å³æè°çèµæºéå¤é®é¢ï¼ï¼ç³»ç»å¯è½ä¸è½è·å¾æ£ç¡®çèµæºãå æ¤ï¼å¯¹äºå
񄧮MFC
DLLçè§åDLLï¼æ们å¿
é¡»è¿è¡æ¨¡ååæ¢ä»¥ä½¿å¾MFCè½å¤æ¾å°æ£ç¡®çèµæºæ¨¡æ¿ã
æ们å¯ä»¥å¨Visual C++ä¸è®¾ç½®MFCè§åDLLæ¯éæé¾æ¥å°MFC DLLè¿æ¯å¨æé¾æ¥å°MFC
DLLãå¦å¾8ï¼ä¾æ¬¡éæ©Visual C++çproject -> Settings ->
Generalèåæé项ï¼å¨Microsoft Foundation
Classesä¸è¿è¡è®¾ç½®ã3.1è§åDLLçå建;
ä¸éMFCdllä¸åçæ¯ï¼å¨å
¶å®ä¹éé¢å¯ä»¥å¼å
¥MFCç±»ï¼å
¶ä»ä¸éMFCä¸æ ·
3.2è§åDLLçè°ç¨
ï¼1ï¼æ¾ç¤ºæ¹å¼LoadLibrary , GetProcAdress , FreeLibrary
(2)
æ们ç
§æ ·å¯ä»¥å¨EXEç¨åºä¸éå¼è°ç¨MFCè§åDLLï¼åªéè¦å°DLLå·¥ç¨çæç.libæ件å.dllæ件æ·å
¥å½åå·¥ç¨æå¨çç®å½ï¼å¹¶å¨RegularDllCallDlg.cppæ件ï¼å¾12æ示对è¯æ¡ç±»çå®ç°æ件ï¼ç顶é¨æ·»å ï¼
#pragma comment(lib,"RegularDll.lib")
3.3å
±äº«MFC DLLçè§åDLLç模ååæ¢
åºç¨ç¨åºè¿ç¨æ¬èº«åå
¶è°ç¨çæ¯ä¸ªDLL模åé½å
·æä¸ä¸ªå
¨å±å¯ä¸çHINSTANCEå¥æï¼å®ä»¬ä»£è¡¨äºDLLæEXE模åå¨è¿ç¨èæ空é´ä¸çèµ·å§å°åãè¿ç¨æ¬èº«ç模åå¥æä¸è¬ä¸º0x400000ï¼èDLL模åç缺çå¥æ为0x10000000ãå¦æç¨åºåæ¶å è½½äºå¤ä¸ªDLLï¼åæ¯ä¸ªDLL模åé½ä¼æä¸åç
HINSTANCEãåºç¨ç¨åºå¨å è½½DLLæ¶å¯¹å
¶è¿è¡äºéå®ä½ã
ããå
񄧮MFC
DLLï¼æMFCæ©å±DLLï¼çè§åDLLæ¶åå°HINSTANCEå¥æé®é¢ï¼HINSTANCEå¥æ对äºå è½½èµæºç¹å«éè¦ãEXEåDLLé½æå
¶èªå·±çèµæºï¼èä¸è¿äºèµæºçIDå¯è½éå¤ï¼åºç¨ç¨åºéè¦éè¿èµæºæ¨¡åçåæ¢æ¥æ¾å°æ£ç¡®çèµæºãå¦æåºç¨ç¨åºéè¦æ¥èªäºDLLçèµæºï¼å°±åºå°èµæºæ¨¡åå¥ææå®ä¸º
DLLç模åå¥æï¼å¦æéè¦EXEæ件ä¸å
å«çèµæºï¼å°±åºå°èµæºæ¨¡åå¥ææå®ä¸ºEXEç模åå¥æã
模åçåæ¢æä¸ç§æ¹å¼ï¼
ï¼1ï¼å¨DLLå½æ°ä¸è°ç¨ï¼AFX_MANAGE_STATE(AfxGetStaticModuleState());ï¼æ¨è使ç¨ï¼æç®åï¼void
ShowDlg(void){//æ¹æ³1:å¨å½æ°å¼å§å¤åæ´ï¼å¨å½æ°ç»ææ¶æ¢å¤//å°AFX_MANAGE_STATE(AfxGetStaticModuleState());ä½ä¸ºæ¥å£å½æ°ç第ä¸//æ¡è¯å¥è¿è¡æ¨¡åç¶æåæ¢AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDialog
dlg(IDD_DLL_DIALOG);//æå¼ID为2000ç对è¯æ¡dlg.DoModal();}ï¼2ï¼å¨DLLå½æ°ä¸è°ç¨AfxGetResourceHandle();AfxSetResourceHandle(HINSTANCE
xxx);
ï¼3ï¼ç±åºç¨ç¨åºèªèº«åæ¢ï¼ä¸æ¨èï¼æ麻ç¦ï¼
4ãæ©å±MFCDLL
MFCæ©å±DLLçå
涵为MFCçæ©å±ï¼ç¨æ·ä½¿ç¨MFCæ©å±DLLå°±å使ç¨MFCæ¬èº«çDLLä¸æ ·ãé¤äºå¯ä»¥å¨MFCæ©å±DLLçå
é¨ä½¿ç¨MFC以å¤ï¼
MFCæ©å±DLLä¸åºç¨ç¨åºçæ¥å£é¨åä¹å¯ä»¥æ¯MFCãæ们ä¸è¬ä½¿ç¨MFCæ©å±DLLæ¥å
å«ä¸äºMFCçå¢å¼ºåè½ï¼è¬å¦æ©å±MFCçCStaticã
CButtonç类使ä¹å
·å¤æ´å¼ºå¤§çè½åã
导åºä¸ä¸ªç±»ï¼ç´æ¥å¨ç±»å£°æ头æ件ä¸ä½¿ç¨AFX_EXT_CLASSå³å¯ï¼æåå«å¿äºå¨è°ç¨dllçç¨åºä¸å å
¥classç头æ件5ãæ»ç»ï¼ç»¼ä¸æè¿°:以ä¸å ç§dll主è¦ç±ä»¥ä¸å ç§åºå«ï¼1ãå¨æé¾æ¥åºæ¯å°exeç¨åºå¨ç¨åºæ§è¡çæ¶åå¨æå è½½çï¼èéæé¾æ¥åºæ¯å¨ç¼è¯çæ¶
å°å
¶ç¼è¯å¨ä»£ç ä¹ä¸ç2ãå¨æé¾æ¥åºå¯ä»¥è¾åºåéãå½æ°åç±»ãå
¶ä¸æ¯ç§è¾åºçæ¹å¼ä¸è°ç¨æ¹å¼ä¸å°½ç¸åï¼ï¼1ï¼åéï¼å¨dllä¸å®ä¹
extern int global;å¨.defæ件ä¸è¾åº EXPORTSglobal DATAæextern
_declspec(dllexport)int global(ä¸ç¨è¾åºæ件äº)å¨ç¨åºä¸è°ç¨ï¼éæè°ç¨ï¼ #pragma
comment(lib,"dllTest.lib")extern int _declspec(dllimport)
global;å¨æè°ç¨:ï¼2ï¼å½æ°:å¨dllä¸å®ä¹extern âCâ __declspec(dllexport) int
add(int a, int b);ä¹å¯ä»¥å¨.defæ件ä¸è¾åºè¯¥å½æ°EXPORTSadd @ 1å¨ç¨åºä¸è°ç¨ï¼éæè°ç¨ï¼#pragma
comment(lib,"dllTest.lib")extern "C" __declspec(dllimport) add(int
x,int y);å¨æè°ç¨ï¼typedef int(*lpAddFun)(int, int); //å®å®ä¹å½æ°æéç±»å
lpAddFun add;//å½æ°æé
HINSTANCE hDll=LoadLibrary(âpathâ);
add=(lpAddFun)GetProcAddress(hDll,
"add");//è·å¾dllä¸çaddå½æ°æé
FreeLibrary(hDll);
å¨ä»dllè°ç¨ä¸è¿åçå½æ°ãæéæè
ç±»é½æ¯ä»¥æéçæ¹å¼ä¼çï¼å³è¿åçæ¯å½æ°ãåéæç±»çå°åãè¿éä¸å®è¦æ³¨æï¼ä¸è½ç®åçç¨å½æ°åæ¥èµå¼ãï¼3ï¼ç±»ï¼å¨dllä¸å®ä¹ï¼
å¨å®ä¹çæ¶åç¨ class _declspec(dllexport) classname{
}
å¨ç±»ä¸å¼ç¨çæ¶åç¨
å å
¥ç±»å®ä¹å¤´æ件ï¼#include âclassname.hâ
Class _declspec(dllimport) classname æ¥å¯¼å
¥ç±»
3ã é¤äºæ©å±MFCçdllå¤ï¼å
¶ä»çdllåå¯è¢«å
¶ä»è¯è¨ç¼åçåºç¨ç¨åºæ¥è°ç¨
温馨提示:内容为网友见解,仅供参考
怎样用C编写DLL?
Extension DLL:用来实现从MFC所继承下来的类的重新利用,也就是说,用这种类 型的动态连接库,可以用来输出一个从MFC所继承下来的类。Extension DLL使用MFC的 动态连接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。各位看到这里如果眼有点花或头有点晕,请别泄气,再看两遍,然后继续往下...
vc支持的三种典型的应用程序
VC++支持的DLL:DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。导出函数的声明方式:一种在函数声明类型和函数名之间加上“_de...
VC中WSOCK32.DLL与ws2_32.dll的区别?
wsock32.dll是1.1版本的,ws2_32.dll是2.0版本的,这就是主要区别咯。不过具体一些来说,2.0版本和1.1版本的区别在于2.0不再需要pseudo-blocking这种技术了,会带来一些兼容性问题。目前1.1的主要用途在于兼容一些MFC应用程序!!新学的话,用2.0。
VC++各种Projects有什么区别
用来创建各种后缀文件。例如创建EXE后缀、DLL后缀文件,EXE和DLL为后缀文件也是最重要,一定要学懂;EXE为后缀文件的创建方式有两种:WIN32和MFC,利用其中一种就可以了,DLL为后缀的文件创建也有两种:动态创建和静态创建。
VC++中的各种文件各起的是什么做用?
vc所支持的文件类型 DSW:全称是Developer Studio Workspace,最高级别的配置文件,记录了整个工作空间的配置信息,她是一个纯文本的文件,在vc创建新项目的时候自动生成 DSP:全称是Developer Studio Project,也是一个配置文件,不过她记录的是一个项目的所有配置信息,纯文本文件 OPT:与DSW、...
和dll 的区别,生成以及使用详解
新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择dll--附加选项:选择导出符号--完成 可以看到生成了一个dllmain.cpp 文件,这是dll应用程序的入口,注意它和普通工程的入口main函数不同,这个文件我们不需要修改。调用动态库 有两种方法调用动态库,一种隐式链接,一种显示链接。...
VC中各个文件或工程类型的作用是什么?
编写Windows程序可以选择 MFC AppWizard(exe)就可以了 如果不想使用MFC可以选择Win32 Application,控制台程序选择Win32 Console Application 编写静态库选择Win32 Static Library 编写动态库选择Win32 Dynamic-Link Library 编写MFC动态库选择MFC AppWizard(dll)其他的有一些是编写数据库,导入其他格式的工程文件...
Activex,OLE,COM,OCX,DLL之间有什么区别
.ocx是ocx控件的扩展名,与.exe .dll同属于PE文件。下面说说什么是ocx控件!OCX 是对象类别扩充组件。如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如EditBox,Grid,ImageBox,Timer等等。每个控件都有自己的事件、方法和属性。使用了...
规则DLL和扩展DLL的区别
如果你是导出的是普通的C++类,那么调用者不一定要是MFC程序啊,普通的程序也可以,反正是用VC++写的都行,因为你导出的时候它会生成一个lib,里面保存了函数名各种信息,VC++都能识别的,跟MFC没关系 所以说,网上的一些说法有点片面,MFC扩展DLL,他们都把它认为是这个DLL都只导出MFC的类了,其实...
在C语言中,能简单介绍一下DLL是干什么的么?
exe是可执行文件,里面存的二进制代码,dll也是存的二进制代码,但是不可以自己执行,要有个exe调用它。就像是主函数和其他函数的关系,只不过存的是机器代码。