MFC制作DLL(导出类和函数)
学了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(导出类和函数)相关推荐
- dll的概念、dll导出类(转)
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...
- DLL导出类和导出函数
from:https://blog.csdn.net/goodluckmt/article/details/52691297 1.动态库DLL中的类或者函数有时候要被其他的库调用,因此需要被其他库调用 ...
- c#调用C++写的dll导出类,如何实现
网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教 解决方案 » 类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管.然后C++文件 ...
- C++dll导出类的方式__declspec(dllexport)
前言 有时导出dll的时候既想用到整个类又想保持多态 一.直接导出整个类 示例: 头文件 #ifdef AITWapper_EXP //根据项目是导入导出预定义 #define AITWapper_D ...
- 关于通过dll导出类模板和函数模板
动态链接库中导出模板函数 C++ 支持函数模板,利用函数模板,可以简化我们的程序代码.我在自己的代码中也经常用到函数模板,但是以前一直以为函数模板是要放到头文件中的,否则调用模板函数时,编译器会找不到 ...
- Dll 导出类 [示例代码]
1.Dll相关代码 MyDll.h [cpp] view plaincopyprint? #ifdef DLL1_API #else #define DLL1_API extern "C&q ...
- VC++动态链接库(DLL)编程(四)――MFC扩展 DLL
VC++动态链接库(DLL)编程(四) ――MFC扩展 DLL 作者:宋宝华 e-mail:21cnbao@21cn.com 前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细 ...
- C++ DLL总结—静动态调用、导出类
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...
- 编写DLL所学所思(2)——导出类
2011.10.6 烛秋 一.导出类的简单方式 这种方式是比较简单的,同时也是不建议采用的不合适方式. 只需要在导出类加上__declspec(dllexport),就可以实现导出类.对象空间还是在使 ...
最新文章
- 2.34模型--简单字符串查找(占位).c
- 帮助方老师使用固态硬盘安装win10,赚了150软妹币(但是他赖账了!)
- 2015.08.17 Ubuntu 14.04+cuda 7.5+caffe安装配置
- linux中使用u盘和光驱的命令_Linux文件操作高频使用命令
- [XSY3383]多线程(笛卡尔树,DP)
- 《Python Cookbook 3rd》笔记(4.15):顺序迭代合并后的排序迭代对象
- 【SpringCloud-Alibaba系列教程】14.一文教你入门RocketMQ
- fiddler抓包工具-- 本地资源替换线上文件
- GNOME如何使用Git
- python中head_Python(Head First)学习笔记:六
- 软件工程大学大三课表_专业选修课 | 面向大二、大三同学的专业选修课全面介绍来啦!...
- console觉醒之路,打印个动画如何?
- linux 开放端口
- Python脚本控制的WebDriver 常用操作 十八 获取测试对象的css属性
- 常用设计模式Python实现
- 嗯,手搓一个TinyPng压缩图片的WebpackPlugin也SoEasy啦
- pandas库下载安装
- 自然语言处理实战——巧用 Amazon Comprehend 分析社交媒体数据
- 数据库常用操作,会持续更新
- 将m3u8文件转MP4、TS、flv、mkv等文件