一个导出类的内部函数的dll

1 dll工程的创建

1.1 新建一个 空 Dll工程名称为“ParameterBindingsDLL”

1.2 所属工程类别: Win32 Dynamic-Link Library

1.3 添加头文件Business.h 、export.h 

1.4 添加实现文件export.cpp

1.5 对应文件源代码

1.5.1 Business.h

#pragma once
#include <stdio.h>

class CBusiness
{
public:
	CBusiness(){};
	virtual ~CBusiness(){};
public:
	virtual void Run()=0;
public:
	void RunLbm(char *pCA)
	{
		Run();
	}
};

class CSimulateAcctQuery:public CBusiness
{
public:
	CSimulateAcctQuery()
	{

	}
	~CSimulateAcctQuery()
	{

	}
public:
	virtual void Run()
	{
		printf("hehe\n");
	}
protected:
private:
};

class CSimulateWinrate:public CBusiness
{
public:
	CSimulateWinrate()
	{

	}
	~CSimulateWinrate()
	{

	}

public:
	virtual void Run(){};

public:
	void SimulateWinrate(char *pCA)
	{
		printf("haha\n");
	}
protected:
private:
};

1.5.2 export.h 

#pragma once
#include "Business.h"
/************************************************************************/
/*               win32 Dynamic-Linkry                                   */
/************************************************************************/

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif // __cplusplus
#endif // NULL

#define EXPORT_LBM_FUNC(EXPORT_FUNC) \
__declspec(dllexport) void* EXPORT_FUNC(char *pCA);

#define LBM_IMPLEMENT(LBM_CLASS, EXPORT_FUNC)	\
	void* EXPORT_FUNC(char *pCA)				\
{												\
	LBM_CLASS BusObj;							\
	BusObj.RunLbm(pCA);							\
	return NULL;								\
}

#define LBM_IMPLEMENT_EXT(LBM_CLASS, EXPORT_FUNC)				\
	void* EXPORT_FUNC(char *pCA)								\
{																\
	LBM_CLASS BusObj;											\
	BusObj.EXPORT_FUNC(pCA);									\
	return NULL;												\
}

#ifdef __cplusplus
extern "C"
{
	EXPORT_LBM_FUNC(SimulateAcctQuery)
	EXPORT_LBM_FUNC(SimulateWinrate)
}
#endif // __cplusplus

1.5.3 export.cpp

#include "export.h"

LBM_IMPLEMENT(CSimulateAcctQuery,SimulateAcctQuery)
LBM_IMPLEMENT_EXT(CSimulateWinrate,SimulateWinrate)

2 调用dll工程的创建

2.1 新建一个 空 Dll工程名称为“CallParameterBindingsDLL”

2.2 所属工程类别: Win32 console Application

2.3 添加实现文件CallParameterBindingsDLL.cpp 

2.4 对应文件源代码

2.4.1 CallParameterBindingsDLL.cpp 

#include <stdio.h>
#include <windows.h>

void MyloadDLL1();
void MyloadDLL2();

int main()
{
	MyloadDLL1();
	MyloadDLL2();

	getchar();
	
	return 0;
}

/*===================================================================
 *    函数名称: $ LoadDLL $
 *    函数功能: 调用本地自己生成的dll文件中的某些功能SimulateAcctQuery
 *    函数入参: 无
 *    函数出参: 无
 *    函数作者: $ xzm $
 *    函数日期: $ 2014-07-24 $
 *    修改记录: 无
/*==================================================================*/
void MyloadDLL1()
{
	//加载动态连接库。
	HMODULE hDllLib = LoadLibrary("ParameterBindingsDLL.dll");

	if (hDllLib)
	{
		// 定义函数指针
		typedef int (WINAPI *PFUNC)(); // #define WINAPI   __stdcall

		// 获取动态连接库里的函数地址。
		PFUNC fpFun = GetProcAddress(hDllLib,"SimulateAcctQuery");
		
		//调用函数运行。
		fpFun();
			
		//释放动态连接库。
		FreeLibrary(hDllLib);
	}
}

/*===================================================================
 *    函数名称: $ LoadDLL $
 *    函数功能: 调用本地自己生成的dll文件中的某些功能SimulateWinrate
 *    函数入参: 无
 *    函数出参: 无
 *    函数作者: $ xzm $
 *    函数日期: $ 2014-07-24 $
 *    修改记录: 无
/*==================================================================*/
void MyloadDLL2()
{
	//加载动态连接库。
	HMODULE hDllLib = LoadLibrary("ParameterBindingsDLL.dll");

	if (hDllLib)
	{
		// 定义函数指针
		typedef int (WINAPI *PFUNC)(); // #define WINAPI   __stdcall

		// 获取动态连接库里的函数地址。
		PFUNC fpFun = GetProcAddress(hDllLib,"SimulateWinrate");
		
		//调用函数运行。
		fpFun();
			
		//释放动态连接库。
		FreeLibrary(hDllLib);
	}
}

/*===================================================================
 *    函数名称: $ TestLoadDLL $
 *    函数功能: 加载动态连接库,为其他加载动态链接库的功能提供了一个途径
 *    函数入参: void
 *    函数出参: void
 *    函数作者: $ 蔡军生 $
 *    函数日期: $ 2007/12/03 $
 *    修改记录: 无
/*==================================================================*/
void TestLoadDLL(void)
{
	//加载动态连接库。
	HMODULE hDllLib = LoadLibrary("Kernel32.dll");
	if (hDllLib)
	{
		//获取动态连接库里的函数地址。
		FARPROC fpFun = GetProcAddress(hDllLib,"GetVersion");
		
		//调用函数运行。
		DWORD dwVersion = (*fpFun)();
		
		//获取WINDOWS的版本。
		DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
		DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
		
		//显示。
		const int nBufSize = 512;
		TCHAR chBuf[nBufSize];
		ZeroMemory(chBuf,nBufSize);
		
		wsprintf(chBuf,"显示版本:%d,%d\r\n",dwWindowsMajorVersion,dwWindowsMinorVersion);
		OutputDebugString(chBuf);		
		//释放动态连接库。
		FreeLibrary(hDllLib);
	}	
}

2.5执行结果


3 关于两个工程的设置问题

3.1 对于ParameterBindingsDLL工程进行如下设置

             工程-设置-常规-输出文件下改成如下内容: ../Bin

3.2 对于CallParameterBindingsDLL工程进行如下设置

             工程-设置-常规-输出文件下改成如下内容: ../Bin

      如下图

  

3.3 ParameterBindingsDLL工程调试加载宿主程序设置

3.4 整个项目在调试的时候,在CallParameterBindingsDLL中启动调试就行,前提是必须两个工程的.pdb文件要存在,至于为什么?你哪来的那么多为什么?

4 关于主工程中不用回调函数指针可不可以的问题

4.1在宿主工程代码中 定义的函数指针应该是 回调函数的指针 不应该是普通函数的指针

typedef int (*PFUNC)();		// 普通函数指针
typedef int (WINAPI *PFUNC)();	// 回调函数指针

4.2几个系统级别的回调函数指针

#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY    WINAPI
#define APIPRIVATE
#define PASCAL      pascal
#endif













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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值