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

一个导出类的内部函数的dll相关推荐

  1. dll的概念、dll导出类(转)

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...

  2. 编写DLL所学所思(2)——导出类

    2011.10.6 烛秋 一.导出类的简单方式 这种方式是比较简单的,同时也是不建议采用的不合适方式. 只需要在导出类加上__declspec(dllexport),就可以实现导出类.对象空间还是在使 ...

  3. DLL入门浅析(4)——从DLL中导出类

    前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小异,废话就不多说了,下面给个简单例子示范一下,也就不多做解释了. DLL头文件: #ifndef _DLL_SAMPLE_H #de ...

  4. C++dll导出类的方式__declspec(dllexport)

    前言 有时导出dll的时候既想用到整个类又想保持多态 一.直接导出整个类 示例: 头文件 #ifdef AITWapper_EXP //根据项目是导入导出预定义 #define AITWapper_D ...

  5. C++ DLL总结—静动态调用、导出类

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...

  6. MFC制作DLL(导出类和函数)

    学了2天MFC导出DLL,发现网上描述的都不是很彻底,我这里给一个教程,希望大家能参考一次成功. 我用VC6,其他版本基本雷同. 首先,VC6新建项目,如下图流程: 点击文件–保存工作空间,把我们的劳 ...

  7. c#调用C++写的dll导出类,如何实现

    网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教 解决方案 » 类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管.然后C++文件 ...

  8. win32以动态链接库导出类及其成员变量

    本文转自:http://hi.baidu.com/ah_leo/blog/item/eccf12f49a0ebce07709d744.html 通常我们在vc程序时候,希望把自己的代码隐藏起来,做成d ...

  9. 用javah 导出类的头文件, 常见的错误及正确的使用方法

    ******************************************************************************** 用javah 导出类的头文件, 常见的 ...

最新文章

  1. MySQL 关于毫秒和微秒的处理,MySQL获取毫秒!
  2. extmail集群的邮件负载均衡方案 [lvs dns postfix]
  3. 后盾网lavarel视频项目---lavarel用户认证实例
  4. SysTick定时器的一个简单应用
  5. Sharding-JDBC(一)简介
  6. ASP.NET开源框架之HIPPO技术内幕(四)--多语言的实现
  7. Java 三大特性 —— 多态
  8. aix服务器屏幕显示被锁住了,Exceed登录AIX远程桌面的问题
  9. python从html拿到数据,python - 使用BeautifulSoup和Python从HTML文件中提取数据 - 堆栈内存溢出...
  10. 安卓端华为推送集成笔记
  11. 团队作业(二):项目选题
  12. 自动编号转化为文本_将您的自动回复器转化为潜在客户
  13. Apex英雄下载慢的解决方法|Apex英雄离线包分享
  14. CTF-实验吧-图片里的动漫
  15. nginx 负载均衡安装及升级步骤
  16. GitHub星数1.3W!五分钟带你搞定Bash脚本使用技巧
  17. 核心单词Word List 48
  18. 对接支付宝App支付和网页支付接口详解
  19. mac电脑装虚拟机遇到的坑!
  20. LeetCode #978. Longest Turbulent Subarray

热门文章

  1. 出场顺序很重要下一句_人生如戏,出场顺序很重要:再见,不负遇见
  2. STM32系列单片机在进入main函数前都在干些什么?
  3. DSB2017第一名代码尝试运行(记录自用)(四)
  4. python3中的rang()函数
  5. windows下安装qt4.7,编译hello QT 成功。
  6. 使用ceph-deploy搭建三节点ceph集群
  7. Java 命令行运行参数大全
  8. python--集合概念和实战(一)
  9. 在CentOS 7上利用systemctl添加自定义系统服务 /usr/lib/systemd/
  10. windows server 2008 DC 活动目录备份还原