DLL即Dynamic Link Library(动态链接库)的缩写。什么是动态链接库。
我用的codeblocks开发环境。
第一步创建一个动态链接库工程
FIle > New > Project > Dynamic Link Library 创建完成后打开main.cpp编辑器会自动生成一段代码
#include "main.h" // a sample exported function void DLL_EXPORT SomeFunction(const LPCSTR sometext) { MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION); } extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process // return FALSE to fail DLL load break; case DLL_PROCESS_DETACH: // detach from process break; case DLL_THREAD_ATTACH: // attach to thread break; case DLL_THREAD_DETACH: // detach from thread break; } return TRUE; // succesful }2、在main.cpp里写一个函数
#include "main.h" // a sample exported function void DLL_EXPORT SomeFunction(const LPCSTR sometext) { MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION); } int DLL_EXPORT add(int a, int b)//这个是自己写的函数,用来返回a+b的值 { return a + b; } extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process // return FALSE to fail DLL load break; case DLL_PROCESS_DETACH: // detach from process break; case DLL_THREAD_ATTACH: // attach to thread break; case DLL_THREAD_DETACH: // detach from thread break; } return TRUE; // succesful }3、编辑器还自动生成了一个头文件
#ifndef __MAIN_H__ #define __MAIN_H__ #include <windows.h> /* To use this exported function of dll, include this header * in your project. */ #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif void DLL_EXPORT SomeFunction(const LPCSTR sometext); int DLL_EXPORT add(int a, int b);//这是add函数的声明 #ifdef __cplusplus } #endif #endif // __MAIN_H__
要在头文件里声明一下自己写的函数。至于extern "C"是什么自己到博客园(吴秦)里看。
4、然后编译这两个文件,因为是dll文件所以无法独立运行。
5、新建一个控制台项目,将编译好的dll文件和头文件拷贝到新项目里,并引入头文件。
#include <iostream> #include "main.h" #include <windows.h> int main() { HMODULE h = NULL;//创建一个句柄h h = LoadLibrary("test.dll"); if(h == NULL)//判断有没有加载test.dll { std::cout << "no test.dll"; return 0; } typedef int (*func)(int, int);//定义函数指针类型 func add = (func)GetProcAddress(h, "add");//获取名为add位函数的地址,如果没有此函数则返回NULL if(add == NULL)//判断是否获得函数地址 { std::cout << "no add function"; return 0; } std::cout << add(3, 4); FreeLibrary(h);//释放 return 0; }
6、贴上输出截图
这是完整调用,无错误。
无test.dll时调用
有test.dll没有add函数时调用