ããéæé¾æ¥åºä¸å¨æé¾æ¥åºåºå«
ããéæé¾æ¥åºä¸å¨æé¾æ¥åºé½æ¯å
±äº«ä»£ç çæ¹å¼ï¼å¦æéç¨éæé¾æ¥åºï¼åæ è®ºä½ æ¿ä¸æ¿æï¼lib ä¸çæ令é½å
¨é¨è¢«ç´æ¥å
å«å¨æç»çæç EXE æ件ä¸äºãä½æ¯è¥ä½¿ç¨ DLLï¼è¯¥ DLL ä¸å¿
被å
å«å¨æç» EXE æ件ä¸ï¼EXE æ件æ§è¡æ¶å¯ä»¥âå¨æâå°å¼ç¨åå¸è½½è¿ä¸ªä¸ EXE ç¬ç«ç DLL æ件ãéæé¾æ¥åºåå¨æé¾æ¥åºçå¦å¤ä¸ä¸ªåºå«å¨äºéæé¾æ¥åºä¸ä¸è½åå
å«å
¶ä»çå¨æé¾æ¥åºæè
éæåºï¼èå¨å¨æé¾æ¥åºä¸è¿å¯ä»¥åå
å«å
¶ä»çå¨ææéæé¾æ¥åºãå¨æåºå°±æ¯å¨éè¦è°ç¨å
¶ä¸çå½æ°æ¶ï¼æ ¹æ®å½æ°æ å°è¡¨æ¾å°è¯¥å½æ°ç¶åè°å
¥å æ æ§è¡ãå¦æå¨å½åå·¥ç¨ä¸æå¤å¤å¯¹dllæ件ä¸åä¸ä¸ªå½æ°çè°ç¨ï¼é£ä¹æ§è¡æ¶ï¼è¿ä¸ªå½æ°åªä¼çä¸ä¸ä»½æ·è´ãä½æ¯å¦ææå¤å¤å¯¹libæ件ä¸åä¸ä¸ªå½æ°çè°ç¨ï¼é£ä¹æ§è¡æ¶ï¼è¯¥å½æ°å°å¨å½åç¨åºçæ§è¡ç©ºé´éçä¸å¤ä»½æ·è´ï¼èä¸æ¯ä¸å¤è°ç¨å°±äº§çä¸ä»½æ·è´ã
ããéæé¾æ¥åºä¸éæé¾æ¥åºè°ç¨è§åæ»ä½æ¯è¾å¦ä¸ï¼
ãã1ã éæé¾æ¥åº(æ¯è¾ç®å)ï¼
ããé¦å
ï¼éæé¾æ¥åºç使ç¨éè¦åºçå¼åè
æä¾çæåºç.h头æ件å.libæ件ãçæåºç.h头æ件ä¸ç声ææ ¼å¼å¦ä¸ï¼
ããextern "C" å½æ°è¿åç±»å å½æ°å(åæ°è¡¨);
ããå¨è°ç¨ç¨åºç.cppæºä»£ç æ件ä¸å¦ä¸ï¼
ãã#include "../lib.h"
ãã#pragma comment(lib,"..//debug//libTest.lib") //æå®ä¸éæåºä¸èµ·é¾æ¥
ããå
¶æ¬¡å 为éæé¾æ¥åºæ¯å°å
¨é¨æ令é½å
å«å
¥è°ç¨ç¨åºçæçEXEæ件ä¸ãå æ¤å¦æç¨çæ¯éæé¾æ¥åºï¼é£ä¹ä¹å°±ä¸åå¨â导åºæ个å½æ°æä¾ç»ç¨æ·ä½¿ç¨âçæ
åµï¼è¦æ³ç¨å°±å¾å
¨è¦ï¼è¦ä¸å°±é½å«è¦!
ãã2ã æé¾æ¥åºï¼
ããå¨æé¾æ¥åºç使ç¨éè¦åºçå¼åè
æä¾çæç.libæ件å.dllæ件ãæè
åªæä¾dllæ件ã
ããé¦å
æ们å¿
é¡»å
注æå°DLLå
çå½æ°å为两ç§ï¼
ãã1) åºå½æ°ï¼å¯ä¾åºç¨ç¨åºè°ç¨ï¼
ãã2) LLå
é¨å½æ°ï¼åªè½å¨ DLL ç¨åºä½¿ç¨ï¼åºç¨ç¨åºæ æ³è°ç¨å®ä»¬ã
ããå æ¤è°ç¨ç¨åºè¥æ³è°ç¨DLLä¸çæ个å½æ°å°±è¦ä»¥æç§å½¢å¼ææ¹å¼ææå®å°åºæ³è°ç¨åªä¸ä¸ªå½æ°ã
ããØ å¯¹äºDLLç导åºï¼å¯ä»¥éç¨å¦ä¸æ¹æ³ï¼
ãã#ifdef WLL_EXPORTS
ãã#define WLL_API __declspec(dllexport)
ãã#else
ãã#define WLL_API __declspec(dllimport)
ãã#endif
ããè¿æ¯å¯¼åºç±»çå®å®ä¹ï¼å°å¯¼åºç±»å¿
é¡»å ä¸è¯¥å®ï¼æè½è¢«å¯¼åºã
ããæ¤å¤çWLL_EXPORTSä¼åºç°å¨ projectà settingsà C++à PreProcessorçPreProcessor definitionä¸ï¼è¿ä¸ªMACRO表æå
¶è¦å®ä¹ä¸ä¸ªå¯¼åºå®ã
ããå½ååºç¼è¯æ¶ï¼å äºWLL_APIçç±»å°è¢«å¯¼åºï¼èå
å«è¯¥å¤´æ件çå
¶ä»è°ç¨DLLæEXEï¼ç±äºæ²¡æå®ä¹WLL_APIå®ï¼å°ç³æ为导å
¥è¯¥ç±»ã
ããØ å¨æåºå½æ°çè°ç¨ï¼å¯ä»¥éç¨éæé¾æ¥çæ¹å¼ï¼ä¸»è¦æ¥éª¤å¦ä¸ï¼
ããå
å«DLLä¸å¯¼åºç头æ件ã
ããéç¨#pragma comment(lib,"..//debug//libTest.lib")导å
¥å¨æåºçæç*.lib头æ件ãæå¨projectà settingsà Linkerà InputçAdditional Dependenciesä¸å å
¥libæ件ã
ããå°å¨æåºçæç*.dllæ件æ¾å°EXEæDLLçåä¸ç®å½ä¸ã
ããØ ä¹å¯ä»¥éç¨å¨æå è½½çæ¹å¼è°ç¨ï¼æ¥éª¤å¦ä¸ï¼
ããAnother.dllæä¸ä¸ªint Add(int x,int y) å½æ°ãåå®æ´çè°ç¨è¿ç¨å¦ä¸ï¼
ããtypedef int (* FunPtr)(int,int); //å®ä¹å½æ°æé
ããFunPtr funPtr;
ããHandle handle =LoadLibrary("Another.dll");
ããfunPtr =ï¼FunPtrï¼GetProcAddress(handle ,"Add");
ããfunPtr(2,3); // 2+3;
ããFreeLibrary(handle); // éæ¾è½½å
¥çå¨æåº
ããLIBæ件
ããç®å以libåç¼çåºæ两ç§ï¼ä¸ç§ä¸ºéæé¾æ¥åº(Static Libaryï¼ä»¥ä¸ç®ç§°âéæåºâ)ï¼å¦ä¸ç§ä¸ºå¨æè¿æ¥åº(DLLï¼ä»¥ä¸ç®ç§°âå¨æåºâ)ç导å
¥åº(Import Libaryï¼ä»¥ä¸ç®ç§°â导å
¥åºâï¼ã
ããéæåºæ¯ä¸ä¸ªæè
å¤ä¸ªobjæ件çæå
ï¼æ以æ人干èæä»objæ件çælibçè¿ç¨ç§°ä¸ºArchiveï¼å³å并å°ä¸èµ·ãæ¯å¦ä½ é¾æ¥ä¸ä¸ªéæåºï¼å¦æå
¶ä¸æéï¼å®ä¼åç¡®çæ¾å°æ¯åªä¸ªobjæéï¼å³éælibåªæ¯å£³åã
ããå¨æåºä¸è¬ä¼æ对åºç导å
¥åºï¼æ¹ä¾¿ç¨åºéæè½½å
¥å¨æé¾æ¥åºï¼å¦åä½ å¯è½å°±éè¦èªå·±LoadLibaryè°å
¥DLLæ件ï¼ç¶ååæå·¥GetProcAddressè·å¾å¯¹åºå½æ°äºãæäºå¯¼å
¥åºï¼ä½ åªéè¦é¾æ¥å¯¼å
¥åºåæç
§å¤´æ件å½æ°æ¥å£ç声æè°ç¨å½æ°å°±å¯ä»¥äºã
ãã导å
¥åºåéæåºçåºå«å¾å¤§ï¼ä»ä»¬å®è´¨æ¯ä¸ä¸æ ·çä¸è¥¿ãéæåºæ¬èº«å°±å
å«äºå®é
æ§è¡ä»£ç ã符å·è¡¨ççï¼è对äºå¯¼å
¥åºèè¨ï¼å
¶å®é
çæ§è¡ä»£ç ä½äºå¨æåºä¸ï¼å¯¼å
¥åºåªå
å«äºå°å符å·è¡¨çï¼ç¡®ä¿ç¨åºæ¾å°å¯¹åºå½æ°çä¸äºåºæ¬å°åä¿¡æ¯ã
ããè¿ä¹æ¯å®é
ä¸å¾å¤å¼æºä»£ç åå¸çæ¯ç¨æ¹å¼ï¼
ãã1ã é¢ç¼è¯çå¼åå
ï¼å
å«ä¸äº.dllæ件åä¸äº.libæ件ãå
¶ä¸è¿éç.libå°±æ¯å¯¼å
¥åºï¼èä¸è¦é以为æ¯éæåºãä½æ¯å¼å
¥æ¹å¼åéæåºä¸æ ·ï¼è¦å¨é¾æ¥è·¯å¾ä¸æ·»å æ¾å°è¿äº.libçè·¯å¾ãè.dllåæ好æ¾å°æå产ççåºç¨ç¨åºexeæ§è¡æ件ç¸åçç®å½ãè¿æ ·è¿è¡æ¶ï¼å°±ä¼èªå¨è°å
¥å¨æé¾æ¥åºã
ãã2ã ç¨æ·èªå·±ç¼è¯ï¼ä¸è½½çæ¯æºä»£ç ï¼æç
§readmeèªå·±ç¼è¯ãçæå¾å¯è½ä¹æ¯.dll + .lib(导å
¥åº)çåºæ件
ãã3ã å¦æä½ åªædllï¼å¹¶ä¸ä½ ç¥édllä¸å½æ°çå½æ°ååï¼é£ä¹ä½ å¯ä»¥ç´æ¥å¨èªå·±ç¨åºä¸ä½¿ç¨LoadLibaryè°å
¥DLLæ件ï¼GetProcAddressè·åå½æ°å°åï¼ç¶åè°ç¨ã
ããDLLæ件
ããå¨æé¾æ¥åº (DLL) æ¯ä½ä¸ºå
±äº«å½æ°åºçå¯æ§è¡æ件ãå¨æé¾æ¥æä¾äºä¸ç§æ¹æ³ï¼ä½¿è¿ç¨å¯ä»¥è°ç¨ä¸å±äºå
¶å¯æ§è¡ä»£ç çå½æ°ãå½æ°çå¯æ§è¡ä»£ç ä½äºä¸ä¸ª DLL ä¸ï¼è¯¥ DLL å
å«ä¸ä¸ªæå¤ä¸ªå·²è¢«ç¼è¯ãé¾æ¥å¹¶ä¸ä½¿ç¨å®ä»¬çè¿ç¨åå¼åå¨çå½æ°ãDLL è¿æå©äºå
±äº«æ°æ®åèµæºãå¤ä¸ªåºç¨ç¨åºå¯åæ¶è®¿é®å
åä¸å个 DLL å¯æ¬çå
容ã
ããå¨æé¾æ¥ä¸éæé¾æ¥çä¸åä¹å¤å¨äºå®å
许å¯æ§è¡æ¨¡åï¼.dll æ件æ .exe æ件ï¼ä»
å
å«å¨è¿è¡æ¶å®ä½ DLL å½æ°çå¯æ§è¡ä»£ç æéçä¿¡æ¯ãå¨éæé¾æ¥ä¸ï¼é¾æ¥å¨ä»éæé¾æ¥åºè·åææ被å¼ç¨çå½æ°ï¼å¹¶å°åºå代ç ä¸èµ·æ¾å°å¯æ§è¡æ件ä¸ã
ãã使ç¨å¨æé¾æ¥ä»£æ¿éæé¾æ¥æè¥å¹²ä¼ç¹ãDLL èçå
åï¼åå°äº¤æ¢æä½ï¼èçç£ç空é´ï¼æ´æäºå级ï¼æä¾å®åæ¯æï¼æä¾æ©å± MFC åºç±»çæºå¶ï¼æ¯æå¤è¯è¨ç¨åºï¼å¹¶ä½¿å½é
çæ¬çå建轻æ¾å®æã
ããAPI å°±æ¯åºç¨ç¨åºç¼ç¨æ¥å£ãå®æ¯è½ç¨æ¥æä½ç»ä»¶ãåºç¨ç¨åºæè
æä½ç³»ç»çä¸ç»å½æ°ãå
¸åçæ
åµä¸ï¼API ç±ä¸ä¸ªæå¤ä¸ªæä¾æç§ç¹æ®åè½ç DLL ç»æã
ããDLL æ¯ä¸ä¸ªæ件ï¼å
¶ä¸å
å«äºå¨ Microsoft Windowsä¸è¿è¡çä»»ä½åºç¨ç¨åºé½å¯è°ç¨çå½æ°ãè¿è¡æ¶ï¼DLL ä¸çå½æ°å¨æå°é¾æ¥å°è°ç¨å®çåºç¨ç¨åºä¸ãæ 论æå¤å°åºç¨ç¨åºè°ç¨ DLL ä¸çæ个å½æ°ï¼å¨ç£çä¸åªæä¸ä¸ªæ件å
å«è¯¥å½æ°ï¼ä¸åªå¨å®è°å
¥å
åæ¶æå建该 DLLã æ¨å¬å°æå¤ç API å¯è½æ¯ Windows APIï¼å®å
æ¬ææ Windows æä½ç³»ç»çåç§ DLLãæ¯ä¸ª Windows åºç¨ç¨åºé½ç´æ¥æé´æ¥å°ä¸ Windows API äºå¨ãWindows API ä¿è¯ Windows ä¸è¿è¡çææåºç¨ç¨åºçè¡ä¸ºæ¹å¼ä¸è´ã
ããéç Windows æä½ç³»ç»çåå±ï¼ç°å·²åå¸äºå 个çæ¬ç Windows APIãWindows 3.1 ä½¿ç¨ Win16 APIãMicrosoft Windows NTãWindows 95 å Windows 98å¹³å°ä½¿ç¨ Microsoft Win32 APIãé¤ Windows API å¤ï¼å
¶ä»ä¸äº API ä¹å·²åå¸ãä¾å¦ï¼é®ä»¶åºç¨ç¨åºç¼ç¨æ¥å£ (MAPI) æ¯ä¸ç»å¯ç¨äºç¼åçµåé®ä»¶åºç¨ç¨åºç DLLãAPI ä¼ ç»ä¸æ¯ä¸ºå¼å Windows åºç¨ç¨åºç C å C++ ç¨åºåç¼åçï¼ä½å
¶ä»çç¼ç¨è¯è¨ï¼å
æ¬VBAï¼ä¹å¯ä»¥è°ç¨ DLL ä¸çå½æ°ãå 为大é¨å DLL 主è¦æ¯ä¸º C å C++ ç¨åºåç¼ååæ´ç说æçï¼æ以è°ç¨ DLL å½æ°çæ¹æ³ä¸è°ç¨ VBA å½æ°ä¼ææä¸åãå¨ä½¿ç¨ API æ¶å¿
é¡»äºè§£å¦ä½ç» DLL å½æ°ä¼ éåæ°ã
ããè¦åï¼è°ç¨ Windows API å å
¶ä» DLL å½æ°å¯è½ä¼ç»æ¨çåºç¨ç¨åºå¸¦æ¥ä¸è¯å½±åãä»èªå·±ç代ç ä¸ç´æ¥è°ç¨ DLL å½æ°æ¶ï¼æ¨ç»è¿äº VBA é常æä¾çä¸äºå®å
¨æºå¶ãå¦æå¨å®ä¹æè°ç¨ DLL å½æ°æ¶åºç°é误ï¼ææç¨åºåé½ä¸å¯é¿å
ï¼ï¼å¯è½ä¼å¨åºç¨ç¨åºä¸å¼èµ·åºç¨ç¨åºé误ï¼ä¹ç§°ä¸ºéç¨æ§ä¿æ¤é误ï¼æ GPFï¼ãæ好ç解å³åæ³æ¯å¨è¿è¡ä»£ç 以åä¿å该项ç®ï¼å¹¶ç¡®ä¿äºè§£ DLL å½æ°è°ç¨çåçã
温馨提示:答案为网友推荐,仅供参考