轉載: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