第一种声明函数为导出函数(__declspec(dllexport))
声明一个导出函数,是说这个函数要从本DLL导出。如果你的DLL里全是C++的类的话,你无法在DEF(后边讲)里指定导出的函数,只能用__declspec(dllexport)导出类
被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。
例子如下:
创建一个dll新建一cpp填写代码如下即可编译链接得到一个dll
extern "C" __declspec(dllexport) int Add(int a,int b)
{
return a+b;
}
再创建一win32控制台程序新建一cpp (作为测试程序)填写代码如下:
#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);
}
简单的两种方法。结合网上资料与百度。
转载于:https://blog.51cto.com/xzv587/1363201