C++导出函数

转自编程达人课件.


//方式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);

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值