最近项目中遇到一个问题,就是需要把我开发的设备生成dll文件给师弟用于软件的开发。设备程序的框架是在mfc中实现的,里面有一个设备类,可用于控制算法的实现,并获得一些设备的参数。现在记载这一个类软件接口的开发方法。

1)打开vs2019,创建一个mfc动态链接库。

图1 mfcdll项目的创建

可以看到,此时系统已经自动创建了一个MFC项目,其中CmdeviceApp类为整个程序类,CmdeviceApp::InitInstance()则是程序的入口函数。在原有项目的文件中,CmdeviceApp下还有一个CmdeviceDlg类,用于实现控制面板的开发。设备类devicetest则是在Cmdeivcedlg下的对象。我们目前的需求是对设备类devicetest进行封装,并暴露接口给到软件开发人员(客户)。使得客户只需要调用函数接口就可以对设备进行操作,不需要进行类的创建等。

      2)将设备类devicetest及其子类放到vcxproj文件所在文件夹中,经过调试成功实现devicetest类的编译

3)新建一个DeviceWrapper.h和DeviceWrapper.cpp文件,内容分别如图2和图3所示。DeviceWrapper.h包含待封装的设备类作为头文件,并包含需要暴露给客户的接口(用__declspec(dllexport)表示)。 编译时,需要将待编译的接口用extern"C"包含,因为C++的编译方式会考虑函数重载,实际的编译后函数名称可能会与所需函数名完全不同。DeviceWrapper.cpp文件将待封装的设备类构造成一个全局变量,并对接口函数进行定义,定义时就会用到类全局变量的成员函数。

#pragma once
#ifndef SIMULATOR_H_
#define SIMULATOR_H_
#include "Devicetest.h"
#ifdef SMTAPI
#define SMTAPI  _declspec(dllimport)
#else
#define SMTAPI  _declspec(dllexport)
#endif#if(defined(WIN32)|defined(WIN64))&!defined(WINCE7)
#define  SMTAPIENTRY  _stdcall
#else
#define SMTAPIENTRY
#endif#ifdef __cplusplus
extern "C" {          //防止函数名字改编,用extern"C"
#endifSMTAPI int SMTAPIENTRY smtopen();#ifdef __cplusplus
}
#endif#endif​

图2 DeviceWrapper.h代码段


#include "stdafx.h"
#include "DeviceWrapper.h"Devicetest* m_simulator = new Devicetest;
CString tt_port("portA");
SMTAPI int SMTAPIENTRY smtopen()
{m_simulator->PFDConnect(tt_port);if (m_simulator->fConnect){return 1;}elsereturn -1;
}​

图3 DeviceWrapper.cpp代码段

4)在m_device.cpp文件中包含DeviceWrapper.h文件,生成解决方案。此时就可以在项目的Debug文件夹中发现封装好的 m_device.dll和m_device.lib文件。

5)使用函数的接口时,只需要把封装好的 m_device.dll、m_device.lib和DeviceWrapper.h文件以及原有设备类子类的dll文件放入客户的vcxproj文件夹中,将lib文件放入附加依赖项,将图2 DeviceWrapper.h文件_declspec(dllexport)改为_declspec(dllimport) ,用户就可以直接调用函数接口操作设备,而设备类的创建由dll和lib文件自动实现。

使用vs2019实现mfc类库dll的开发相关推荐

  1. VC++动态链接库(DLL)编程(四)――MFC扩展 DLL

    VC++动态链接库(DLL)编程(四) ――MFC扩展 DLL 作者:宋宝华  e-mail:21cnbao@21cn.com   前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细 ...

  2. 多线程编程之二——MFC中的多线程开发

    五.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...

  3. VC++6 开发MFC扩展DLL以及MFC DLL可以包含界面

    VC环境可以开发win32 DLL和MFC DLL:下面来开发一个MFC DLL:Win7, VC6: 新建一个MFC exe工程:名为mfcddd:在同级目录下新建一个文件夹,名为mfcbin: 默 ...

  4. MFC三大dll使用总结

    DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库.DLL是建立在客户/服务器通 ...

  5. MFC下DLL编程(图解)

    DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库.DLL是应用程序的一种扩展,也是软件共享和重用的传 ...

  6. MFC 类库结构 总结

    MFC主要类库结构总结 MFC类主要分为应用程序结构类.窗口支持类.图书设备类.模版集合类.简单数据类型类以及全局AFX函数等6个类. 1.      应用程序结构类 应用程序结构类代表的是应用程序的 ...

  7. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实现字典的打印...

    系列回顾 从上一篇文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实例一个模块(商品字典)开始我带领大家进入WinForm篇,并且使用示例的形式详细的演示了数据 ...

  8. VC++动态链接库(DLL)编程(三)――MFC规则DLL

    VC++动态链接库(DLL)编程(三) ――MFC规则DLL 作者:宋宝华  e-mail:21cnbao@21cn.com 第4节我们对非MFC DLL进行了介绍,这一节将详细地讲述MFC规则DLL ...

  9. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在UI中应用DataUIMapper组件...

    系列回顾 WinForm篇我用了一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实例一个模块(商品字典)和一步一步教你使用AgileEAS.NET基础类库进行应用开 ...

  10. Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~

    转自:http://www.byywee.com/page/M0/S530/530822.html 昨天编译文件时出现了Building MFC application with /MD[d] (CR ...

最新文章

  1. OpenStack环境搭建(五:附加项虚拟机文件备份使用)
  2. 简陋,山寨,Everything,桌面搜索,原理,源码
  3. LeetCode之Reverse String II
  4. 部署到Maven中央存储库
  5. 排序算法:归并排序算法实现及分析
  6. php中头部含义,PHP 常用的header头部定义汇总大全
  7. 6-2 是否二叉搜索树 (25 分)
  8. MySQL数据库查询重复数据办法
  9. 静态初始化中不能放入繁重计算,否则会变慢!
  10. 新高考成绩分析教师增值评价系统1:新高考等级赋分转换
  11. 数据库建表操作SQL代码大全
  12. 分布式任务调度相关介绍
  13. Xenu软件检查网站死链接
  14. 如何进阶为数据科学家
  15. APR协议及RARP协议
  16. 《机器学习实战》——第3章 决策树
  17. ACM顶会CIKM 2022放榜!度小满AI Lab三篇入选
  18. 【调剂】航天科工四院四部2023年度自培研究生开始调剂啦!!!
  19. 微信小程序突然多了好多动态_让微信小程序的登陆页面有云朵悬浮的动态效果...
  20. 易语言如何防止进程被终止或者如何隐藏进程

热门文章

  1. list 排序 java_java 怎么将List里面数据排序?
  2. qstringlist格式怎么写到txt_怎样把PDF转成TXT呢?
  3. pythonddos防御_一个自动封IP防御DDOS脚本
  4. VI编辑器将//替换为#
  5. 面向对象三大特性之——继承
  6. 乌班图服务器系统网卡驱动,Linux_Ubuntu系统无法衔接网络 该怎样安装无线网卡驱动?,ubuntu已经很好的兼容了主流的 - phpStudy...
  7. 转存文章— 网游加速器实现原理解析
  8. alidoing --使用JS实现多语言框架、喜欢的请进、、瓦特平台!
  9. PhalApi视频教程
  10. 微信小程序远程git代码管理