现在的位置: 首页 > 综合 > 正文

动态的加载动态链接库

2014年02月08日 ⁄ 综合 ⁄ 共 1036字 ⁄ 字号 评论关闭

要动态的加载一个动态链接库,我们需要一个函数。

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);

抱歉!评论已关闭.