c++ä¸å
±æ两ç§åºï¼
1ãLIBå
å«äºå½æ°æå¨ç
DLLæ件åæ件ä¸å½æ°ä½ç½®çä¿¡æ¯ï¼å
¥å£ï¼ï¼ä»£ç ç±è¿è¡æ¶å è½½å¨è¿ç¨ç©ºé´ä¸çDLLæä¾ï¼ç§°ä¸º
å¨æé¾æ¥åºdynamic link libraryãï¼è¿ç§æ¹å¼æ´çµæ´»ï¼åçç¨åºä½ç§¯å°ï¼ä½æ¯éè¦.exeådllåæ¶åå¸ï¼
2ãLIBå
å«å½æ°ä»£ç æ¬èº«ï¼å¨ç¼è¯æ¶ç´æ¥å°ä»£ç å å
¥ç¨åºå½ä¸ï¼ç§°ä¸ºéæé¾æ¥åºstatic link libraryãï¼è¿ç§æ¹å¼ä¸æ¯å¾çµæ´»ï¼å 为lib被ç¼è¯å°.exeä¸ï¼ååºçç¨åºä½ç§¯å¤§ï¼ä½æ¯åªéè¦åå¸exeå³å¯ï¼ä¸éè¦dllæ件ï¼
å
±æ两ç§é¾æ¥æ¹å¼ï¼
1ãå¨æé¾æ¥ä½¿ç¨å¨æé¾æ¥åºï¼å
许å¯æ§è¡æ¨¡åï¼.dllæ件æ.
exeæ件ï¼ä»
å
å«å¨è¿è¡æ¶å®ä½DLLå½æ°çå¯æ§è¡ä»£ç æéçä¿¡æ¯ã
2ãéæé¾æ¥ä½¿ç¨éæé¾æ¥åºï¼é¾æ¥å¨ä»éæé¾æ¥åºLIBè·åææ被å¼ç¨å½æ°ï¼å¹¶å°åºå代ç ä¸èµ·æ¾å°
å¯æ§è¡æ件ä¸ã
å
³äºlibådllçåºå«å¦ä¸ï¼
ï¼1ï¼libæ¯ç¼è¯æ¶ç¨å°çï¼dllæ¯è¿è¡æ¶ç¨å°çãå¦æè¦å®æ
æºä»£ç çç¼è¯ï¼åªéè¦libï¼å¦æè¦ä½¿å¨æé¾æ¥çç¨åºè¿è¡èµ·æ¥ï¼åªéè¦dllã
ï¼2ï¼å¦æædllæ件ï¼é£ä¹libä¸è¬æ¯ä¸äºç´¢å¼ä¿¡æ¯ï¼è®°å½äºdllä¸å½æ°çå
¥å£åä½ç½®ï¼dllä¸æ¯å½æ°çå
·ä½å
容ï¼å¦æåªælibæ件ï¼é£ä¹è¿ä¸ªlibæ件æ¯éæç¼è¯åºæ¥çï¼ç´¢å¼åå®ç°é½å¨å
¶ä¸ã使ç¨éæç¼è¯çlibæ件ï¼å¨è¿è¡ç¨åºæ¶ä¸éè¦åæ
å¨æåºï¼ç¼ºç¹æ¯å¯¼è´
åºç¨ç¨åºæ¯è¾å¤§ï¼èä¸å¤±å»äºå¨æåºççµæ´»æ§ï¼åå¸æ°çæ¬æ¶è¦åå¸æ°çåºç¨ç¨åºæè¡ã
ï¼3ï¼å¨æé¾æ¥çæ
åµä¸ï¼æ两个æ件ï¼ä¸ä¸ªæ¯LIBæ件ï¼ä¸ä¸ªæ¯DLLæ件ãLIBå
å«è¢«DLL导åºçå½æ°å称åä½ç½®ï¼DLLå
å«å®é
çå½æ°åæ°æ®ï¼åºç¨ç¨åºä½¿ç¨LIBæ件é¾æ¥å°DLLæ件ãå¨åºç¨ç¨åºçå¯æ§è¡æ件ä¸ï¼åæ¾çä¸æ¯è¢«è°ç¨çå½æ°ä»£ç ï¼èæ¯DLLä¸ç¸åºå½æ°ä»£ç çå°åï¼ä»èèçäºå
åèµæºãDLLåLIBæ件å¿
é¡»éåºç¨ç¨åºä¸èµ·åè¡ï¼å¦ååºç¨ç¨åºä¼äº§çé误ãå¦æä¸æ³ç¨libæ件æè
没ælibæ件ï¼å¯ä»¥ç¨WIN32 APIå½æ°LoadLibraryãGetProcAddressè£
è½½ã
ï¼éæè¿æ¥ï¼ä½¿ç¨libé注æ两个æ件ï¼
ï¼1ï¼.h
头æ件ï¼å
å«libä¸è¯´æè¾åºçç±»æ符å·ååæ
æ°æ®ç»æãåºç¨ç¨åºè°ç¨libæ¶ï¼éè¦å°è¯¥æ件å
å«å
¥åºç¨ç¨åºç
æºæ件ä¸ã
ï¼2ï¼.LIBæ件ï¼ç¥ã
ï¼å¨æè¿æ¥ï¼ä½¿ç¨dllé注æä¸ä¸ªæ件ï¼
ï¼1ï¼.h头æ件ï¼å
å«dllä¸è¯´æè¾åºçç±»æ符å·ååææ°æ®ç»æç.hæ件ãåºç¨ç¨åºè°ç¨dllæ¶ï¼éè¦å°è¯¥æ件å
å«å
¥åºç¨ç¨åºçæºæ件ä¸ã
ï¼2ï¼.LIBæ件ï¼æ¯dllå¨ç¼è¯ãé¾æ¥æåä¹åçæçæ件ï¼ä½ç¨æ¯å½å
¶ä»åºç¨ç¨åºè°ç¨dllæ¶ï¼éè¦å°è¯¥æ件å¼å
¥åºç¨ç¨åºï¼å¦å产çé误ãå¦æä¸æ³ç¨libæ件æè
没ælibæ件ï¼å¯ä»¥ç¨WIN32APIå½æ°LoadLibraryãGetProcAddressè£
è½½ã
ï¼3ï¼.dllæ件ï¼çæ£çå¯æ§è¡æ件ï¼å¼åæååçåºç¨ç¨åºå¨åå¸æ¶ï¼åªéè¦æ.exeæ件å.dllæ件ï¼å¹¶ä¸éè¦.libæ件å.h头æ件ã
使ç¨libçæ¹æ³ï¼
éælibä¸ï¼ä¸ä¸ªlibæ件å®é
ä¸æ¯ä»»æ个
objæ件çéåï¼objæ件æ¯cppæ件ç¼è¯çæçãå¨ç¼è¯è¿ç§éæåºå·¥ç¨æ¶ï¼æ ¹æ¬ä¸ä¼éå°é¾æ¥é误ï¼å³ä½¿æéï¼ä¹åªä¼å¨ä½¿ç¨è¿ä¸ªlibçEXTæ件æè
DLLå·¥ç¨éæ´é²åºæ¥ã
å¨VCä¸æ°å»ºä¸ä¸ªstatic libraryç±»åçå·¥ç¨Libï¼å å
¥test.cppæ件åtest.hæ件ï¼å¤´æ件å
å
æ¬å½æ°å£°æï¼ï¼ç¶åç¼è¯ï¼å°±çæäºLib.libæ件ã
å«çå·¥ç¨è¦ä½¿ç¨è¿ä¸ªlibæ两ç§æ¹å¼ï¼
ï¼1ï¼å¨project->link->Object/Library Moduleä¸å å
¥Lib.libæ件ï¼å
æ¥è¯¢å·¥ç¨ç®å½ï¼åæ¥è¯¢ç³»ç»Libç®å½ï¼ï¼æè
å¨æºä»£ç ä¸å å
¥æ令#pragma comment(lib, âLib.libâ)ã
ï¼2ï¼å°Lib.libæ·å
¥å·¥ç¨æå¨ç®å½ï¼æè
æ§è¡æ件çæçç®å½ï¼æè
ç³»ç»Libç®å½ä¸ã
ï¼3ï¼å å
¥ç¸åºç头æ件test.hã
使ç¨DLLçæ¹æ³ï¼
使ç¨å¨æé¾æ¥ä¸çlibï¼ä¸æ¯objæ件çéåï¼å³éé¢ä¸ä¼æå®é
çå®ç°ï¼å®åªæ¯æä¾å¨æé¾æ¥å°DLLæéè¦çä¿¡æ¯ï¼è¿ç§libå¯ä»¥å¨ç¼è¯ä¸ä¸ªDLLå·¥ç¨æ¶ç±
ç¼è¯å¨çæã
å建DLLå·¥ç¨çæ¹æ³ï¼ç¥ï¼ã
ï¼1ï¼éå¼é¾æ¥
第ä¸ç§æ¹æ³æ¯ï¼éè¿project->link->Object/Library Moduleä¸å å
¥.libæ件ï¼æè
å¨æºä»£ç ä¸å å
¥æ令#pragma comment(lib, âLib.libâ)ï¼ï¼å¹¶å°.dllæ件置å
¥å·¥ç¨æå¨ç®å½ï¼ç¶åæ·»å 对åºç.h头æ件ã
#include "stdafx.h"
#include "DLLSample.h"
#pragma comment(lib, "DLLSample.lib") //ä½ ä¹å¯ä»¥å¨é¡¹ç®å±æ§ä¸è®¾ç½®åºçé¾æ¥
int main()
{
TestDLL(123); //dllä¸çå½æ°ï¼å¨DllSample.hä¸å£°æ
return(1);
}
ï¼2ï¼æ¾å¼é¾æ¥
éè¦
å½æ°æéåWIN32 APIå½æ°LoadLibraryãGetProcAddressè£
è½½ï¼ä½¿ç¨è¿ç§è½½å
¥æ¹æ³ï¼ä¸éè¦.libæ件å.h头æ件ï¼åªéè¦.dllæ件å³å¯ï¼å°.dllæ件置å
¥å·¥ç¨ç®å½ä¸ï¼ã
#include <iostream>
#include <windows.h> //使ç¨å½æ°åæäºç¹æ®åé
typedef void (*DLLFunc)(int);
int main()
{
DLLFunc dllFunc;
HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");
if (hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
if (dllFunc == NULL)
{
FreeLibrary(hInstLibrary);
}
dllFunc(123);
std::cin.get();
FreeLibrary(hInstLibrary);
return(1);
}
LoadLibraryå½æ°å©ç¨ä¸ä¸ªå称ä½ä¸ºåæ°ï¼è·å¾DLLçå®ä¾ï¼HINSTANCEç±»åæ¯å®ä¾çå¥æï¼ï¼é常è°ç¨è¯¥å½æ°åéè¦æ¥çä¸ä¸å½æ°è¿åæ¯å¦æåï¼å¦æä¸æååè¿åNULLï¼å¥ææ æï¼ï¼æ¤æ¶è°ç¨å½æ°FreeLibraryéæ¾DLLè·å¾çå
åã
GetProcAddresså½æ°å©ç¨DLLçå¥æåå½æ°çå称ä½ä¸ºåæ°ï¼è¿åç¸åºçå½æ°æéï¼åæ¶å¿
须使ç¨å¼ºè½¬ï¼å¤æå½æ°æéæ¯å¦ä¸ºNULLï¼å¦ææ¯åè°ç¨å½æ°FreeLibraryéæ¾DLLè·å¾çå
åãæ¤åï¼å¯ä»¥ä½¿ç¨å½æ°æéæ¥è°ç¨å®é
çå½æ°ã
æåè¦è®°å¾ä½¿ç¨FreeLibraryå½æ°éæ¾å
åã
注æï¼åºç¨ç¨åºå¦ä½æ¾å°DLLæ件ï¼
使ç¨LoadLibraryæ¾å¼é¾æ¥ï¼é£ä¹å¨å½æ°çåæ°ä¸å¯ä»¥æå®DLLæ件çå®æ´è·¯å¾ï¼å¦æä¸æå®è·¯å¾ï¼æè
è¿è¡éå¼é¾æ¥ï¼Windowså°éµå¾ªä¸é¢çæ索顺åºæ¥å®ä½DLLï¼
ï¼1ï¼å
å«EXEæ件çç®å½
ï¼2ï¼å·¥ç¨ç®å½
ï¼3ï¼Windowsç³»ç»ç®å½
ï¼4ï¼Windowsç®å½
ï¼5ï¼åå¨Path
ç¯å¢åéä¸çä¸ç³»åç®å½