调用dll中函数的两种方法

第一种声明函数为导出函数(__declspec(dllexport))ios

 声明一个导出函数,是说这个函数要从本DLL导出。若是你的DLL里全是C++的类的话,你没法在DEF(后边讲)里指定导出的函数,只能用__declspec(dllexport)导出类windows

被extern "C"修饰的变量和函数是按照C语言方式编译和链接的。C和C++对函数的处理方式是不一样的.extern "C"是使C++可以调用C写做的库文件的一个手段,若是要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来讲明。ide

例子以下:函数

建立一个dll新建一cpp填写代码以下便可编译连接获得一个dll测试

extern "C" __declspec(dllexport) int Add(int a,int b)指针

{文档

       return a+b;     字符串

}        编译器

再建立一win32控制台程序新建一cpp (做为测试程序)填写代码以下:it

#include <iostream.h>

#include <windows.h>

void main()

{

       HINSTANCE Hdll = GetModuleHandle("AddDll.dll");

       if (NULL == Hdll)

       {

              Hdll = LoadLibrary("AddDll.dll");

       }

       typedef int (*TESTDLL) (int a,int b); //定义函数指针接收咱须要的函数

       TESTDLL pAdd;

       pAdd =(TESTDLL)GetProcAddress(Hdll,"Add"); //获得地址初始化咱的函数指针

       int c = pAdd(1,3);  //调用

       cout<<"c = "<<c<<endl;

FreeLibrary(Hdll);   //在恰当的时候释放句柄。

}

编译连接运行结果输出c = 4

第二种方法.def文件(模块定义文件) 是一个有.def扩展名的文本文件。它被用于导出一个DLL的函数,和__declspec(dllexport)很类似

*.DEF文件的编写(是在dll文件中写的不是测试工程中)

内容以下:

LIBRARY "xxx"

EXPROTS

myFunction1 @1

myFunction2 @2

前面两行是固定格式

"xxx"是DLL名,不带扩展名的

第三行四行是本身的函数名,后面的@后的数字是函数序号,不论编译器将函数名改为啥样,但DLL根据序号来调用函数,

 例子以下:

 建立一个dll新建一cpp填写代码以下

int __stdcall Add(int a,int b)

{     

       return a+b;     

}

int __stdcall Sub(int a,int b)

{

       return a-b;

}

编写def文件(vc6.0高级的编译环境能够直接添加def文件)

在此dll工程的根目录下编写便可在此须要新建一文本文档改后缀名为def便可内容以下

LIBRARY AddDll

EXPORTS

 

Add @ 1

Sub @ 2

写好只好将其添加到咱dll的工程中 工程—增长到工程---文件选择咱的def文件便可 编译连接生成目标dll      

再建立一win32控制台程序新建一cpp (做为测试程序)填写代码以下:

#include <iostream.h>

#include <windows.h>

void main()

{

HINSTANCE Hdll = GetModuleHandle("AddDll.dll");

if (NULL == Hdll)

{

       Hdll = LoadLibrary("AddDll.dll");

}

typedef int (__stdcall *TESTDLL) (int a,int b); //定义函数指针接收咱须要的函数

TESTDLL pAdd;

pAdd =(TESTDLL)GetProcAddress(Hdll,MAKEINTRESOURCE(2));.//调用序号为2的函数

//MAKEINTRESOURCE的做用:是把一个"数字形ID",转化为"字符串".

//可是执行先后,输入的数据的内容和长度是不变的!它只不过就是C语言里面"强制类型转换"而已.

int c = pAdd(1,3);  //调用

cout<<"c = "<<c<<endl;

FreeLibrary(Hdll);

}

简单的两种方法。结合网上资料与百度。

相关文章
相关标签/搜索