动态链接库(dll)文件主要用来共享程序,节省计算机运行时的内存空间。创建和使用dll文件一般都有两种方式(具体自己搜搜看)。这里说说我使用创建和调用方式。
dll 文件的创建:
创建工具可以使用vc6.0即可,当然visual studio 更好。
dll 中包含的是一组函数(对于c++来讲,面向对象这种方式在这里几乎派不上用场),是一个函数库。这里创建时有3个文件,.h,.cpp和 .def 文件。.h 和 .cpp 文件就是普通的头文件和源文件。
int sum(int arg1, int arg2); int sub(int arg1, int arg2); int big(int arg1, int arg2);
int sum(int arg1, int arg2) { return arg1 + arg2; } int sub(int arg1, int arg2) { return arg1 - arg2; } int big(int arg1, int arg2) { return arg1 > arg2 ? arg1 : arg2; }
上面简单的写了头文件和源文件。现在看下 def 文件。
;def example
LIBRARY insyeah_math_dll.dll EXPORTS sum @1 sub @2 big @3
def 文件指定了dll库名和要导出的函数名,@1,@2指明函数顺序。完成三个文件之后便可编译成链接库文件。有用的是 .h,.lib 和 .dll 文件。但是,为了减少调用时的麻烦步骤,只要.dll文件即可。
dll 文件的使用:
一个dll 文件是一个函数库,调用时只要指定库和库中的函数即可。如下面的调用:
#include <windows.h> #include <iostream> using namespace std; typedef int (*MathDLL)(int, int); int main() { MathDLL math; //load math dll HMODULE hModule = ::LoadLibrary(TEXT("insyeah_math_dll.dll")); if(hModule == NULL) { ::FreeLibrary(hModule); } math = (MathDLL)::GetProcAddress(hModule, "sum"); if(math == NULL) { ::FreeLibrary(hModule); } int res = math(5, 5); cout << res << endl; ::FreeLibrary(hModule); system("PAUSE"); return 0; }
上面的 LoadLibrary 指明调用的库名,GetProcAddress 指明库中的函数名。 FreeLibraray 关闭库调用。调用过程比较简单,只是在调用的时候需要设置与库中函数相应的函数指针,再根据指针调用函数。