一个导出类的内部函数的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几个系统级别的回调函数指针
|
一个导出类的内部函数的dll相关推荐
- dll的概念、dll导出类(转)
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...
- 编写DLL所学所思(2)——导出类
2011.10.6 烛秋 一.导出类的简单方式 这种方式是比较简单的,同时也是不建议采用的不合适方式. 只需要在导出类加上__declspec(dllexport),就可以实现导出类.对象空间还是在使 ...
- DLL入门浅析(4)——从DLL中导出类
前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小异,废话就不多说了,下面给个简单例子示范一下,也就不多做解释了. DLL头文件: #ifndef _DLL_SAMPLE_H #de ...
- C++dll导出类的方式__declspec(dllexport)
前言 有时导出dll的时候既想用到整个类又想保持多态 一.直接导出整个类 示例: 头文件 #ifdef AITWapper_EXP //根据项目是导入导出预定义 #define AITWapper_D ...
- C++ DLL总结—静动态调用、导出类
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...
- MFC制作DLL(导出类和函数)
学了2天MFC导出DLL,发现网上描述的都不是很彻底,我这里给一个教程,希望大家能参考一次成功. 我用VC6,其他版本基本雷同. 首先,VC6新建项目,如下图流程: 点击文件–保存工作空间,把我们的劳 ...
- c#调用C++写的dll导出类,如何实现
网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教 解决方案 » 类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管.然后C++文件 ...
- win32以动态链接库导出类及其成员变量
本文转自:http://hi.baidu.com/ah_leo/blog/item/eccf12f49a0ebce07709d744.html 通常我们在vc程序时候,希望把自己的代码隐藏起来,做成d ...
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
******************************************************************************** 用javah 导出类的头文件, 常见的 ...
最新文章
- MySQL 关于毫秒和微秒的处理,MySQL获取毫秒!
- extmail集群的邮件负载均衡方案 [lvs dns postfix]
- 后盾网lavarel视频项目---lavarel用户认证实例
- SysTick定时器的一个简单应用
- Sharding-JDBC(一)简介
- ASP.NET开源框架之HIPPO技术内幕(四)--多语言的实现
- Java 三大特性 —— 多态
- aix服务器屏幕显示被锁住了,Exceed登录AIX远程桌面的问题
- python从html拿到数据,python - 使用BeautifulSoup和Python从HTML文件中提取数据 - 堆栈内存溢出...
- 安卓端华为推送集成笔记
- 团队作业(二):项目选题
- 自动编号转化为文本_将您的自动回复器转化为潜在客户
- Apex英雄下载慢的解决方法|Apex英雄离线包分享
- CTF-实验吧-图片里的动漫
- nginx 负载均衡安装及升级步骤
- GitHub星数1.3W!五分钟带你搞定Bash脚本使用技巧
- 核心单词Word List 48
- 对接支付宝App支付和网页支付接口详解
- mac电脑装虚拟机遇到的坑!
- LeetCode #978. Longest Turbulent Subarray
热门文章
- 出场顺序很重要下一句_人生如戏,出场顺序很重要:再见,不负遇见
- STM32系列单片机在进入main函数前都在干些什么?
- DSB2017第一名代码尝试运行(记录自用)(四)
- python3中的rang()函数
- windows下安装qt4.7,编译hello QT 成功。
- 使用ceph-deploy搭建三节点ceph集群
- Java 命令行运行参数大全
- python--集合概念和实战(一)
- 在CentOS 7上利用systemctl添加自定义系统服务 /usr/lib/systemd/
- windows server 2008 DC 活动目录备份还原