学了2天MFC导出DLL,发现网上描述的都不是很彻底,我这里给一个教程,希望大家能参考一次成功。
我用VC6,其他版本基本雷同。
首先,VC6新建项目,如下图流程:




点击文件–保存工作空间,把我们的劳动成果先保存一下。
然后点文件–新建:

继续新建c++文件:

MLib.h文件内容:

#ifndef __MLIB__20200919__ // 防止重复,加上年月日,做个留念
#define __MLIB__20200919__class MLib
{public:__declspec(dllexport) static BOOL AppAlreadyRunning(const char *appKey);__declspec(dllexport) static CString GetAppExeDIRPath();
};#endif

MLib.cpp内容:

#include "StdAfx.h"
#include "MLib.h"BOOL MLib::AppAlreadyRunning(const char *appKey)
{// 创建互斥量HANDLE m_hMutex = CreateMutex(NULL, FALSE, _T(appKey));// 检查错误代码DWORD nRet = GetLastError();if (nRet == ERROR_ALREADY_EXISTS){CloseHandle(m_hMutex);m_hMutex = NULL;return TRUE;} else {return FALSE;}
}CString MLib::GetAppExeDIRPath()
{CString  strPathName;GetModuleFileName(NULL, strPathName.GetBuffer(1024), 1024);strPathName.ReleaseBuffer();int nPos  = strPathName.ReverseFind('\\');return strPathName.Left(nPos + 1);
}

导出类是不需要额外声明的,只要你声明一下导出类的各个方法即可,不管方法是否为静态,不信你建一个不是static的成员函数试试!关键就在于类方法前面加上__declspec(dllexport),这个方法就导出了,当然,导出函数也是一样的,比如在cpp文件里写函数后,头文件声明为:
__declspec(dllexport) void test();
你就可以导出这个函数给别的程序调用了。
编译:

调用DLL的方法:
新建一个MFC应用程序项目,这里我就不细说了。建好以后,建议在StdAfx.h中增加声明:

#include "../tlib/MLib.h"
#pragma comment(lib, "../tlib/Debug/Tlib.lib")

然后记得把之前编译好的Tlib.dll文件拷贝到你要调试程序的Debug目录下(或Release目录下,或你要发布应用的目录中,因为程序首先找相同目录下的dll嘛)。
调用方法就跟你把文件加入项目中一起编译时一样了,只不过你包含的头文件有__declspec(dllexport),但这并不影响include。
比如下面方法调用:

if (MLib::AppAlreadyRunning("111")) {AfxMessageBox("应用程序111已经运行中");return FALSE;}AfxMessageBox(MLib::GetAppExeDIRPath());

你可以保证程序不会重复运行,还能方便的获取当前目录,是不是包装一些常用方法到DLL动态库,更方便我们日常开发呢?

附录:引用DLL常见错误
编译DLL一般都好通过,但调用DLL的程序,我经常遇到2类错误:
1、编译阶段的链接时错误:
Linking…
111.obj : error LNK2001: unresolved external symbol “class CString __cdecl Base64Encode(unsigned char const *,unsigned int)” (?Base64Encode@@YA?AVCString@@PBEI@Z)
Debug/111.exe : fatal error LNK1120: 1 unresolved externals
这是说链接器从lib中找不到调用函数的符号,这时我们应该检查DLL库编译时是否有声明__declspec(dllexport),比如上述错误需要:__declspec(dllexport) CString Base64Encode(const unsigned char *src, size_t srclen);,当然这行声明应该写在.h文件里,然后让cpp文件引用,这里是说DLL库,不是说调用DLL的应用程序。修改后重新编译DLL,将保证lib和dll文件都被拷贝到需要的位置(我上面的列子是直接将lib设置到项目里,用父路径引用了其他项目的lib库了)。
2、运行时错误

这一看就知道是DLL文件没有拷贝到当前程序运行的目录下导致的。拷贝过来即可解决问题。
提一下:记得发布时应该用Release版本的dll库。

MFC制作DLL(导出类和函数)相关推荐

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

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

  2. DLL导出类和导出函数

    from:https://blog.csdn.net/goodluckmt/article/details/52691297 1.动态库DLL中的类或者函数有时候要被其他的库调用,因此需要被其他库调用 ...

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

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

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

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

  5. 关于通过dll导出类模板和函数模板

    动态链接库中导出模板函数 C++ 支持函数模板,利用函数模板,可以简化我们的程序代码.我在自己的代码中也经常用到函数模板,但是以前一直以为函数模板是要放到头文件中的,否则调用模板函数时,编译器会找不到 ...

  6. Dll 导出类 [示例代码]

    1.Dll相关代码 MyDll.h [cpp] view plaincopyprint? #ifdef DLL1_API #else #define DLL1_API extern "C&q ...

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

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

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

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

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

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

最新文章

  1. 2.34模型--简单字符串查找(占位).c
  2. 帮助方老师使用固态硬盘安装win10,赚了150软妹币(但是他赖账了!)
  3. 2015.08.17 Ubuntu 14.04+cuda 7.5+caffe安装配置
  4. linux中使用u盘和光驱的命令_Linux文件操作高频使用命令
  5. [XSY3383]多线程(笛卡尔树,DP)
  6. 《Python Cookbook 3rd》笔记(4.15):顺序迭代合并后的排序迭代对象
  7. 【SpringCloud-Alibaba系列教程】14.一文教你入门RocketMQ
  8. fiddler抓包工具-- 本地资源替换线上文件
  9. GNOME如何使用Git
  10. python中head_Python(Head First)学习笔记:六
  11. 软件工程大学大三课表_专业选修课 | 面向大二、大三同学的专业选修课全面介绍来啦!...
  12. console觉醒之路,打印个动画如何?
  13. linux 开放端口
  14. Python脚本控制的WebDriver 常用操作 十八 获取测试对象的css属性
  15. 常用设计模式Python实现
  16. 嗯,手搓一个TinyPng压缩图片的WebpackPlugin也SoEasy啦
  17. pandas库下载安装
  18. 自然语言处理实战——巧用 Amazon Comprehend 分析社交媒体数据
  19. 数据库常用操作,会持续更新
  20. 将m3u8文件转MP4、TS、flv、mkv等文件

热门文章

  1. 什么是进程? ( 进程的详细概念 )
  2. 适配 通知 Notification 通知渠道 前台服务 MD
  3. 干货丨一文带你读懂深度学习:AI 认识世界的方式如同小孩
  4. spring的生命周期详解
  5. 鸿蒙手机体验怎么样,鸿蒙手机系统体验
  6. 正确使用计算机进行语文教学设计,语文《小池》教学设计
  7. STM32 系列产品命名规则
  8. 又到毕业季,来元宇宙围观毕业典礼
  9. 《深度影响》心得感悟
  10. Jackson(二):@JsonFormat时间格式及时区问题