c++ 動態庫的加載


轉載:https://blog.csdn.net/ztq_12345/article/details/99677769

 

使用ide是vs, 使用Windows.h下的3個函數對動態庫進行加載
第一個:HMODULE LoadLibrary(LibFileName : PChar)//獲取dll句柄
參數是需要加載dll的路徑,返回值dll句柄
第二個:FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName)//獲取函數地址
第一個參數是dll的句柄 ,第二個是調用dll中函數的名稱。返回值調用函數地址
第三個:FreeLibrary(HMODULE hModule)//釋放dll
參數是需要釋放dll的句柄
加載動態庫你需要包含2個文件  第一個是動態鏈接庫.dll文件  第二個是靜態庫.lib
其中需要注意的是你需要在被調用dll中的函數前面一定要加  __declspec(dllexport)  加了過后外部才可以調用
__declspec(dllexport) char *creat()
不過這樣編譯過后還是會報錯 127     這是因為c++支持重載 在編譯的時候會在函數后邊添加了函數的形參  與c語言不一致,所以在調用dll的時候會找不到調用的函數。你只需要添加extern "C"告訴編譯器使用c編譯這一部分 就可以運行成功了,
extern “C”  __declspec(dllexport) char *creat()
具體代碼如下
#include <iostream>
#include <Windows.h>
//加載lib
#pragma comment(lib,"C:\\Users\\ztq\\Desktop\\vs\\plugin_dll\\Debug\\C:\\Users\\ztq\\Desktop\\vs\\plugin_dll\\Debug\\.lib")
int main()
{
 HMODULE hDLL;
 ***//這里是獲取dll句柄***
 hDLL = LoadLibrary("C:\\Users\\ztq\\Desktop\\vs\\plugin_dll\\Debug\\plugin_dll.dll");
 if (hDLL)
 {
    ***//這里是定義指針 。int 是你調用函數返回的類型***  FUNCTION就是一個名稱  后面那個括號是跟你的調用函數參數,多個用,號隔開
     //我調用dll中的函數沒有參數為空,
  typedef  char *(WINAPI *FUNCTION)();  
  
  ***//這里是獲取調用dll函數的地址***
  FUNCTION fun = (FUNCTION)GetProcAddress(hDLL, "creat");   
  
  if (fun)
  { 
  ***//這里是調用dll中的函數  ***函數返回的是“test” 。

   std::cout<<fun()<<std::endl;
  }
  else
  {
  ***//如果調用錯誤就打印錯誤信息***
   std::cout << GetLastError() << std::endl;
  }
 }
 ***//釋放dll***
 FreeLibrary(hDLL);
 system("pause");
 return 0;
}
————————————————
版權聲明:本文為CSDN博主「ztq_12345」的原創文章,遵循CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ztq_12345/article/details/99677769


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM