ÃûÌÃÍæÅª¹«Ö÷ÓÈÎïspsm(ÅÝܽµ°Ì¢¿É°®¶à)_ÃûÌÃÍæÅª¹«Ö÷..."/> ¸÷ÈË¿´¹ý¹¬¶·¾çµÄ»°£¬¿ÉÄÜÒ²ÄÜÏëÏóµ½²ÌÂ׵ľ½¿ö..."/>
¡¶ÃûÌÃÍæÅª¹«Ö÷ÓÈÎïspsm(ÅÝܽµ°Ì¢¿É°®¶à)_ÃûÌÃÍæÅª¹«Ö÷...¡·¾çÇé¼ò½é£º¸÷ÈË¿´¹ý¹¬¶·¾çµÄ»°¿ÉÄÜÒ²ÄÜÏëÏóµ½²ÌÂ׵ľ½¿ö...ÃûÌÃÍæÅª¹«Ö÷ÓÈÎïspsm(ÅÝܽµ°Ì¢¿É°®¶à)_ÃûÌÃÍæÅª¹«Ö÷...ºäºäºäC++»ù´¡Óï·¨ÊáÀí£ºWindows µÄ¶¯Ì¬Á´½Ó¿â2021-11-01 17:46¡¤CÓïÑÔ±à³ÌWindows Ó¦ÓóÌÐòÈë¿Úº¯ÊýGUI£¨Graphical User Interface£©Ó¦ÓÃÁ´½ÓÆ÷Ñ¡Ï/SUBSYSTEM:WINDOWSCUI£¨Console User Interface£©Ó¦ÓÃÁ´½ÓÆ÷Ñ¡Ï/SUBSYSTEM:CONSOLE_tWinMain Óë _tmain º¯ÊýÉùÃ÷Int WINAPI _tWinMain( HINSTANCE hInstanceExe, HINSTANCE, PTSTR pszCmdLine, int nCmdShow);int _tmain( int argc, TCHAR *argv[], TCHAR *envp[]);Windows µÄ¶¯Ì¬Á´½Ó¿â£¨Dynamic-Link Library£©²¿·Ö֪ʶµãÀ´×Ô¡¶Windows ½¹µã±à³Ì£¨µÚÎå°æ£©¡·Óô¦£¨1£©À©Õ¹ÁËÓ¦ÓóÌÐòµÄÌØÕ÷£¨2£©¼ò»¯ÁËÏîÄ¿¹ÜÀí£¨3£©ÓÐÖúÓÚ½ÚÔ¼Äڴ棨4£©Ôö½øÁË×ÊÔ´µÄ¹²Ïí£¨5£©Ôö½øÁËÍâµØ»¯£¨6£©ÓÐÖúÓÚ½â¾öƽ̨¼äµÄ²î±ð£¨7£©¿ÉÒÔÓÃÓÚÌØÊâÄ¿µÄ×¢ÖØ£¨1£©½¨Éè DLLÊÂʵÉÏÊÇÔÚ½¨Éè¿É¹©Ò»¸ö¿ÉÖ´ÐÐÄ£¿éŲÓõĺ¯Êý£¨2£©µ±Ò»¸öÄ£¿éÌṩһ¸öÄÚ´æ·ÖÅɺ¯Êý£¨malloc¡¢new£©µÄʱ¼äËü±ØÐèͬʱÌṩÁíÒ»¸öÄÚ´æÊͷź¯Êý£¨free¡¢delete£©£¨3£©ÔÚʹÓà C ºÍ C++ »ì±àµÄʱ¼äҪʹÓà extern "C" ÐÞÊηû£¨4£©Ò»¸ö DLL ¿ÉÒÔµ¼³öº¯Êý¡¢±äÁ¿£¨×èÖ¹µ¼³ö£©¡¢C++ Àࣨµ¼³öµ¼ÈëÐèҪͬ±àÒëÆ÷²»È»×èÖ¹µ¼³ö£©£¨5£©DLL Ä£¿é£ºcpp ÎļþÖÐµÄ __declspec(dllexport) дÔÚ include Í·Îļþ֮ǰ£¨6£©Å²Óà DLL µÄ¿ÉÖ´ÐÐÄ£¿é£ºcpp ÎļþµÄ __declspec(dllimport) ֮ǰ²»Ó¦¸Ã½ç˵ MYLIBAPI¼ÓÔØ Windows ³ÌÐòµÄËÑË÷˳Ðò1¡¢°üÀ¨¿ÉÖ´ÐÐÎļþµÄĿ¼2¡¢Windows µÄϵͳĿ¼¿ÉÒÔͨ¹ý GetSystemDirectory »ñµÃ3¡¢16 λµÄϵͳĿ¼¼´ Windows Ŀ¼ÖÐµÄ System ×ÓĿ¼4¡¢Windows Ŀ¼¿ÉÒÔͨ¹ý GetWindowsDirectory »ñµÃ5¡¢Àú³ÌµÄÄ¿½ñĿ¼6¡¢PATH ÇéÐαäÁ¿ÖÐËùÁгöµÄĿ¼DLL Èë¿Úº¯ÊýDllMain º¯ÊýBOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){ switch(fdwReason) { case DLL_PROCESS_ATTACH: // µÚÒ»´Î½«Ò»¸öDLLÓ³Éäµ½Àú³ÌµØÖ·¿Õ¼äʱŲÓà // The DLL is being mapped into the process' address space. break; case DLL_THREAD_ATTACH: // µ±Àú³Ì½¨ÉèÒ»¸öÏ̵߳Äʱ¼äÓÃÓÚ¸æËßDLLÖ´ÐÐÓëÏß³ÌÏà¹ØµÄ³õʼ»¯£¨·ÇÖ÷Ïß³ÌÖ´ÐУ© // A thread is bing created. break; case DLL_THREAD_DETACH: // ϵͳŲÓà ExitThread Ïß³ÌÍ˳öǰ¼´½«ÖÕÖ¹µÄÏß³Ìͨ¹ý¸æËßDLLÖ´ÐÐÓëÏß³ÌÏà¹ØµÄÕûÀí // A thread is exiting cleanly. break; case DLL_PROCESS_DETACH: // ½«Ò»¸öDLL´ÓÀú³ÌµÄµØÖ·¿Õ¼äʱŲÓà // The DLL is being unmapped from the process' address space. break; } return (TRUE); // Used only for DLL_PROCESS_ATTACH}ÔØÈëÐ¶ÔØ¿âLoadLibrary¡¢LoadLibraryExA¡¢LoadPackagedLibrary¡¢FreeLibrary¡¢FreeLibraryAndExitThread º¯ÊýÉùÃ÷// ÔØÈë¿âHMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);HMODULE LoadLibraryExA( LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);// ÈôÒªÔÚͨÓà Windows ƽ̨£¨UWP£©Ó¦ÓÃÖмÓÔØ Win32 DLLÐèҪŲÓà LoadPackagedLibrary¶ø²»ÊÇ LoadLibrary »ò LoadLibraryExHMODULE LoadPackagedLibrary( LPCWSTR lpwLibFileName, DWORD Reserved);// Ð¶ÔØ¿âBOOL WINAPI FreeLibrary( _In_ HMODULE hModule);// Ð¶ÔØ¿âºÍÍ˳öÏß³ÌVOID WINAPI FreeLibraryAndExitThread( _In_ HMODULE hModule, _In_ DWORD dwExitCode);ÏÔʾµØÁ´½Óµ½µ¼³ö·ûºÅGetProcAddress º¯ÊýÉùÃ÷FARPROC GetProcAddress( HMODULE hInstDll, PCSTR pszSymbolName // Ö»ÄܽÓÊÜ ANSI ×Ö·û´®²»¿ÉÊÇ Unicode);DumpBin.exe Éó²é DLL ÐÅÏ¢ÔÚ VS µÄ¿ª·¢Ö°Ô±ÏÂÁîÌáÐÑ·û ʹÓà DumpBin.exe ¿ÉÉó²é DLL ¿âµÄµ¼³ö¶Î£¨µ¼³öµÄ±äÁ¿¡¢º¯Êý¡¢ÀàÃûµÄ·ûºÅ£©¡¢Ïà¶ÔÐéÄâµØÖ·£¨RVArelative virtual address£©È磺LoadLibrary Óë FreeLibrary Á÷³ÌͼLoadLibrary Óë FreeLibrary Á÷³ÌͼLoadLibraryFreeLibraryDLL ¿âµÄ±àд£¨µ¼³öÒ»¸ö DLL Ä£¿é£©DLL ¿âµÄ±àд£¨µ¼³öÒ»¸ö DLL Ä£¿é£© DLL Í·Îļþ// MyLib.h#ifdef MYLIBAPI// MYLIBAPI Ó¦¸ÃÔÚËùÓÐ DLL Ô´ÎļþµÄ include "Mylib.h" ֮ǰ±»½ç˵// ËùÓк¯Êý/±äÁ¿ÕýÔÚ±»µ¼³ö#else// Õâ¸öÍ·Îļþ±»Ò»¸öexeÔ´´úÂëÄ£¿é°üÀ¨Òâζ×ÅËùÓк¯Êý/±äÁ¿±»µ¼Èë#define MYLIBAPI extern "C" __declspec(dllimport)#endif// ÕâÀï½ç˵ÈκεÄÊý¾Ý½á¹¹ºÍ·ûºÅ// ½ç˵µ¼³öµÄ±äÁ¿£¨×èÖ¹µ¼³ö±äÁ¿£©MYLIBAPI int g_nResult;// ½ç˵µ¼³öº¯ÊýÔÐÍMYLIBAPI int Add(int nLeft, int nRight);DLL Ô´Îļþ// MyLibFile1.cpp// °üÀ¨±ê×¼WindowsºÍCÔËÐÐʱͷÎļþ#include
¡¶ÃûÌÃÍæÅª¹«Ö÷ÓÈÎïspsm(ÅÝܽµ°Ì¢¿É°®¶à)_ÃûÌÃÍæÅª¹«Ö÷...¡·ÊÓÆµËµÃ÷£ºËûÒ»¶¨Óв½·¥............¿ªÅ̰뵼Ìå°å¿éÕûÌ屬·¢ÖÐо¹ú¼Ê¡¢¸´µ©Î¢µç¡¢»ªºç¹«Ë¾¡¢ÖÐ΢¹«Ë¾µÈ30¶àÖ»¸ö¹ÉÕÇÍ£ÐÂÎÅÃæÉÏ10ÔÂÒÔÀ´¸Û¹É°ëµ¼Ìå°å¿éÒ»Á¬´óÕÇÖÐо¹ú¼Ê±¾ÔÂÀÛÕǽü60%ÉϺ£¸´µ©±¾ÔÂÀÛÕÇ73%»ªºç°ëµ¼Ìå±¾ÔÂÀÛÕÇ55%¼ÌÐøÐû²¼
2025-10-10 21:47:18