c++ 调用dll函数,导出类中的成员函数

对于dll的操作,我们可以使用dumpbin查看dll 和lib。

********注意写好dll后 用depends查看导出函数时会发现导出的函数名不是你写的那样出现所谓的乱码入?等*************这就注定dll不能通过显示连接的方式导入。

如果想通过显示连接的方式导入可以为类添加一个友元函数去实现显示连接创建类得对象**************************************

这里对于导出类,我们使用隐式链接;直接看代码;

/** 隐式链接,导入lib是必须的*/
#pragma comment(lib,"tool.lib")
//要么自己使用头文件
//extern int add(int a,int b);

//_declspec(dllimport) int mul(int a,int b);


void CAndroidDialog::OnBnClickedButtonDll()
{
	// TODO: 在此添加控件通知处理程序代码
	//隐式调用C++类
	Ctool tmp;
	CString str;
	str.Format(_T("5-3=%d"),tmp.sub(5,3));
	MessageBox(str);
	str.Format(_T("15/3=%d"),tmp.div(15,3));
	MessageBox(str);
	//
	int c=add(12,65);
	CString result;
	result.Format(_T("%d\n"),c);
	AfxMessageBox(result);
	c=mul(2,5);
	result.Format(_T("%d\n"),c);
	AfxMessageBox(result);
	//动态加载
	HINSTANCE hInst;
	hInst=LoadLibrary(_T("tool.dll"));
	typedef int (*ADDPROC)(int a,int b);
	ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"?add@@YAHHH@Z");
	if(!Add)
	{

		MessageBox(_T("获取函数地址失败!"));
		return ;
	}
	
	str.Format(_T("5+3=%d"),Add(5,3));
	MessageBox(str);
	//通过序号访问
	typedef int (*MULPROC)(int a,int b);
	MULPROC Mul=(MULPROC)GetProcAddress(hInst,reinterpret_cast<LPCSTR>(MAKEINTRESOURCE(6)));
	if(!Mul)
	{
		MessageBox(_T("获取函数地址失败!"));
		return ;

	}
	str.Format(_T("5*3=%d"),Mul(5,3));
	MessageBox(str);	
	//访问c++类中成员,dll到处类不能显示链接,要使用隐式调用
	//http://blog.csdn.net/l460602540/article/details/7394593
	typedef Ctool * (*GetCTool)();//定义函数指针,获取类TestDLL对象
	GetCTool getCtool=(GetCTool)GetProcAddress(hInst,"GetCTool");
	if(!getCtool)
	{
		MessageBox(_T("获取C++类中函数地址失败!"));
		return ;

	}
	Ctool *tool=getCtool();
	str.Format(_T("5-3=%d"),tool->sub(5,3));
	MessageBox(str);
	str.Format(_T("15/3=%d"),tool->div(15,3));
	MessageBox(str);

	if(hInst)
	{
		FreeLibrary(hInst);
	}
}
另外附上dll工程文件;

tool.h

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 TOOL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// TOOL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef TOOL_EXPORTS
#define TOOL_API  /**extern "C"*/ __declspec(dllexport)
#else
#define TOOL_API /**extern "C"*/ __declspec(dllimport)
#endif

//删除tool.def文件,项目=》属性=》连接器=》输入=》模块定义文件
// 此类是从 tool.dll 导出的
class TOOL_API Ctool {
public:
	Ctool(void);
	
	//可以单独导出类中的函数,导出函数必须是public权限,才可以给其他程序访问
	/**TOOL_API*/ int sub(int a,int b);
	int div(int a,int b);
};

extern TOOL_API int ntool;

TOOL_API int /**_stdcall */ fntool(void);//这里可以修改调用约定,包括_stdcall(WINAPI),pascal,__cdecl __fastcall

TOOL_API int   add(int a,int b);

TOOL_API int mul(int a,int b);

extern "C" TOOL_API Ctool* GetCTool(); //获取类TestDll的对象

tool.cpp

// tool.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "tool.h"


// 这是导出变量的一个示例
TOOL_API int ntool=0;

// 这是导出函数的一个示例。
TOOL_API int fntool(void)
{
	return 42;
}

// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 tool.h
Ctool::Ctool()
{
	return;
}
int Ctool::sub(int a,int b)
{

	return a-b;
}
int Ctool::div(int a,int b)
{

	return a/b;
}

TOOL_API int add(int a,int b)
{

	return a+b;
}

TOOL_API int mul(int a,int b)
{

	return a*b;
}
//常规的dll是不支持类的导出的.只支持c风格的函数的导出.要弄MFC DLL工程才行
extern "C" TOOL_API Ctool *GetCTool()
{

	return new Ctool();
}




  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值