动态链接库的学习(一)

VC++动态链接库DLL编程深入浅出

4.非MFC DLL

4.1一个简单的DLL    

首先在VC++中new一个win 32 Dynamic-Link Library工程dllTest。MFC AppWizard(dll)建立的是MFC动态链接库。

      在建立的工程中添加lib.h和lib.cpp文件

/*lib.h*/

#ifndef LIB_H

#define LIB_H

extern "C" int _declspec(dllexport)add(int x,int y);

#endif

/*lib.cpp*/

#include "lib.h"

int add(int x,int y)

{

  return x+y;

}

    然后新建一个与DLL工程处于同一工作区的应用工程dllCall,它调用DLL中的函数add。

#include "stdafx.h"
#include "windows.h"

typedef int ( * lpAddFun)(int,int);

int main(int argc, char* argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary("..\\Debug\\dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll,"add");
if(addFun!=NULL)
{
int result = addFun(2,3);
printf("%d",result);
}
FreeLibrary(hDll);
}
return 0;
}

    dllTest工程中的lib.h对函数add的声明前面添加了_declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。DLL内的函数分为两种:

     一.DLL导出函数,可供应用程序调用;

     二.DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。

下面来分析DLL的调用。

      首先,语句typedef int (* lpAddFun)(int ,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;

      其次,在函数main中定义了一个DLL HINSTANCE 句柄实例hDLL,通过WIn32 APi函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDLL;

      再次,在函数main中通过WIn32 APi函数GEtProcAddress得到了所加载的DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用。

      最后,应用工程使用完DLL后,在函数main中通过Win32 APi函数FreeLibrary释放了已经加载的DLL模块。

      通过这个简单的例子,我们获知的DLL定义和调用的一般概念:

      一.DLL中需以某种特定的方式声明导出函数(或变量、类);

      二.应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。

原文地址:https://www.cnblogs.com/zhanglibra/p/3345979.html