要动态的加载一个动态链接库,我们需要一个函数。
HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of executable module
);
这个函数不仅可以加载一个动态链接库,还可以加载可执行资源。
他有一个参数,指定了可执行模块的名称。 该函数的返回类型是 HMODULE。
HMODULE类型和HINSTANCE类型可以通用。
我们现在一个动态链接库,dll1.dll。 里边有2个方法,一个是int add(int x, int y);
一个是int subtract(int x, int y);
我们首先定义个实例的句柄变量 HINSTANCE hInst;
hInst = LoadLibrary("dll1.dll"); //这里加载动态链接库 dll1.dll
//这里我们就获得了,动态链接库模块的句柄。
有了动态链接库模块的句柄,接下来我们需要得到该动态链接库中导出的函数的地址。
我们想要获得导出的函数的地址需要用到GetProcAddress() 这个函数
FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);
有两个参数:
第一个参数,指定动态链接库模块的句柄,我们已经得到了
第二个是函数名:
一个指向常量的字符指针,指定dll导出函数的名字或函数的序号。如果该函数指定的是导出函数的序号,那么该序号必须在低位字中,高位字必须是0;
返回值是FARPOC 如果函数成功返回值是动态链接库导出函数的地址,如果函数失败,返回值是NULL;
我们可以先定义一个函数指针类型。
typedef int (*ADDPROC) (int a, int b); //这个函数为一个函数指针类型,作用是接收GetProcAddress函数返回的动态链接库导出函数的地址。
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"add"); //这里,我们看到进行了一次强制类型转换,因为GetProcAddress返回值是FARPROC,所以需要进行一下转换。
这里我们看到的FARRPOC是一个函数指针类型
我们判断一下是否得到了我们想要获得的函数的地址。
if(Add==NULL)
{
MessageBox("获取函数地址失败!");
}
这样我们就可以调用我们的add函数了
Add(5,3);