转自编程达人课件.
//方式1
//extern "C" _declspec(dllexport) 调用约定 返回类型 函数名(参数列表);
extern "C"
{
_declspec(dllexport) int plus(int a,int b)
{
return a+b;
}
_declspec(dllexport) int sub(int a,int b)
{
return a-b;
}
_declspec(dllexport) int mul(int a,int b)
{
return a*b;
}
_declspec(dllexport) int div(int a,int b)
{
return a/b;
}
}
//方式2
int plusNum(int a,int b)
{
return a+b;
}
int subNum(int a,int b)
{
return a-b;
}
int mulNum(int a,int b)
{
return a*b;
}
int divNum(int a,int b)
{
return a/b;
}
建立文本文件test.def
//函数名 @编号
//函数名 @编号 NONAME
文件内容如下:
EXPORTS
plusNum @3
subNum @5
mulNum @6 NONAME
divNum @7
------------------------------------------
调用方式:
方式1:
#include "stdafx.h"
#include<iostream>
#include<Windows.h>
#include<time.h>
using namespace std;
typedef int(*DllFun)(int,int);
//调用DLL案例
int main(int argc, char* argv[])
{
DllFun plus;
DllFun sub;
DllFun mul;
DllFun div;
HINSTANCE hdll;
//hdll=LoadLibrary("./DemoDll.dll");
hdll=LoadLibrary("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\DemoDll\\Debug\\DemoDll.dll");
if(hdll==NULL)
{
FreeLibrary(hdll);
printf("load失败");
}
plus=(DllFun)GetProcAddress(hdll,"plus");
sub=(DllFun)GetProcAddress(hdll,"sub");
mul=(DllFun)GetProcAddress(hdll,"mul");
div=(DllFun)GetProcAddress(hdll,"div");
if(plus==NULL)
{
FreeLibrary(hdll);
}
cout<<plus(3,2)<<"\n";
cout<<sub(3,2)<<"\n";
cout<<mul(3,2)<<"\n";
cout<<div(4,2)<<"\n";
printf("Hello World!\n");
return 0;
}
如何实现调用时DLL无需导出函数?
LoadLibrary加载dll,在DllMain里创建新线程调用自己的功能块儿(做好互斥等细节,防止重复调用)
2、创建动态链接库
<1> extern "C" _declspec(dllexport) 调用约定 返回类型 函数名 (参数列表);
<2> 使用.def文件:
EXPORTS
函数名 @编号
函数名 @编号 NONAME
使用序号导出的好处:
名字是一段程序就精华的注释,通过名字可以直接猜测到函数的功能
通过使用序号,可以达到隐藏的目的
3、使用动态链接库
步骤1: //定义函数指针,如:
typedef int (__stdcall *lpPlus)(int,int);
typedef int (__stdcall *lpSub)(int,int);
步骤2: //声明函数指针变量,如:
lpPlus myPlus;
lpSub mySub;
步骤3: //动态加载dll到内存中,如:
HINSTANCE hModule = LoadLibrary("DllDemo.dll");
步骤4: //获取函数地址,如:
myPlus = (lpPlus)GetProcAddress(hModule, "Plus");
mySub = (lpSub)GetProcAddress(hModule, (char*)0x10);
步骤5: //调用函数,如:
int a = myPlus(10,2);
int b = mySub(10,2);
步骤6: //释放动态链接库,如:
FreeLibrary(hModule);