动态库DLL中类的使用
一、DLL中类的导出
在类名称前添加 _declspec(dllexport)定义,比如:
class _declspec(dllexport) CMath{
....
};
通常使用预编译开关切换类的导入导出定义,比如:
#ifdef DLLCLASS_EXPORTS
#define EXT_CLASS _declspec(dllexport)
//DLL
#else
#define EXT_CLASS _declspec(dllimport)
//使用者
#endif
class EXT_CLASS CMath{
...........
};
二、使用DLL中的类
1、导入DLL的lib
2、类的定义
3、使用类
样例代码例如以下:
DLL类源代码
.h文件
#ifndef _DLL_CLASS_
#define _DLL_CLASS_ //定义导入。导出宏开关.
#ifdef DLLCLASS_EXPORT
#define EXT_CLASS _declspec(dllexport)
#else
#define EXT_CLASS _declspec(dllimport)
#endif class EXT_CLASS CMath
{
public:
int Add(int num1,int num2);
int Sub(int num1,int num2);
}; #endif
.cpp文件
#define DLLCLASS_EXPORT #include "DllClass.h"
#include <WINDOWS.H>
#include <CSTDIO> BOOL CALLBACK DllMain(HINSTANCE hInst,DWORD fDwReason,VOID* Reserve)
{
switch(fDwReason)
{
case DLL_PROCESS_ATTACH:
{
//初始化工作.
printf(__TEXT("DllClass is loading.\r\n"));
}
break;
case DLL_PROCESS_DETACH:
{
//善后处理工作.
printf(__TEXT("DllClass is unloading.\r\n"));
}
break;
case DLL_THREAD_ATTACH:
{ }
break;
case DLL_THREAD_DETACH:
{ }
break;
} return 1;
} int CMath::Add(int num1,int num2)
{
return num1+num2;
} int CMath::Sub(int num1,int num2)
{
return num1-num2;
}
我们看到上面的DLL类中包括了DllMain(...)函数,这个函数为DLL动态库的程序入口。
入口程序不是DLL必须的,经常使用于DLL内部初始化或善后处理。
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
//动态库实例句柄
DWORD
fdwReason, //初调用原因
LPVOID
lpvReserved //保留值
); 返回TRUE,表示动态库载入成功。
DllMain(.... ) 动态库的载入或卸载时会被调用。
比如:使用LoadLibrary或FreeLibrary时会被调用。
fdwReason取值例如以下:
#define DLL_PROCESS_ATTACH 1 //进程载入
#define DLL_THREAD_ATTACH 2 //线程载入
#define DLL_THREAD_DETACH 3 //线程卸载
#define DLL_PROCESS_DETACH 0 //进程卸载
动态库DLL中类的使用的更多相关文章
- Qt编写自定义控件插件开放动态库dll使用(永久免费)
这套控件陆陆续续完善了四年多,目前共133个控件,除了十几个控件参考网友开源的代码写的,其余全部原创,在发布之初就有打算将动态库开放出来永久免费使用,在控件比较完善的今天抽了半天时间编译了多个qt版本 ...
- 五,动态库(dll)的封装与使用
在项目开发中,我们经常会使用到动态库(dll),要么是使用别人的动态库,要么是将功能函数封装为动态库给别人用.那么如何封装和使用动态库呢?以下内容为你讲解. 1.动态库的封装 以vs2010为例,我们 ...
- 在VS2015中用C++编写可被其它语言调用的动态库DLL
转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...
- C++与C#有关对库(动态库dll,静态库.lib)文件的调用
1 动态库的相互调用 1.1 C#调用C++ dll步骤(只能导出方法): 1. c++建立空项目->源文件文件夹中添加cpp文件和函数 2. c++属性设置中,配置类型设置为动态库dll,公共 ...
- Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...
- C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...
- 关于修改动态库DLL的问题
最近在做一个小软件,需要做到新建.修改动态链接库(DLL)的功能.新建很简单,但是在修改的时候我突然发现问题来了.首先软件会在启动的时候将所有协议加载出来,然后做展示.此时你可以添加或减少动态库中的属 ...
- 动态库DLL加载方式-静态加载和动态加载
静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...
- C#直接使用DllImport调用C/C++动态库(dll文件)
1.C/C++动态库的编写 下面是我编写的一个比较简单的C++dll文件用来测试,关于如何编写dll文件,我这里便不再赘述,不懂得自行查询, (1).h文件 #ifdef MYDLL_EXPORTS ...
随机推荐
- git merge简介
git merge的基本用法为把一个分支或或某个commit的修改合并到现在的分支上.我们可以运行git merge -h和git merge --help查看其命令,后者会直接转到一个网页(git的 ...
- JDK和CGLIB生成动态代理类的区别
关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...
- [JSOI2009]等差数列
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1558 题解: 考虑这么用线段树进行维护,由于他有区间修改等差数列 很容易想到可以用差分数组来维 ...
- [CodeChef]GERALD07/[JZOJ4739]Ztxz16学图论
题解: 考虑从小到大枚举右端点 对于每个点,令它的权值等于它的编号 那么我们可以用lct维护出一颗最大生成树 维护方法是每次插入一条判断他们在不在一颗树上 若不在直接加,若在就找到链上的最小值 之后看 ...
- 利用IntelliJ IDEA 创建第一个项目
1.创建项目 打开后点击第一个按钮
- 洛谷P1926 小书童—刷题大军【01背包】
题目链接:https://www.luogu.org/problemnew/show/P1926 题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的 ...
- centos 支持复制与粘贴
centos 要支持与主机的交互,vmtools 必不可少. 为了方便虚拟机和主机之间复制粘贴文件,拖拽文件,需要安装VMwareTools.下面将我的安装步骤记录如下:第一步:打开虚拟机后,在VM的 ...
- 011.Docker仓库管理
一 Docker仓库介绍 docker 仓库,即 registry,实现了镜像的管理.分发,同时还包括用户的认证.docker registry 仓库是一个无状态的.高可靠的服务器应用程序,用来存储d ...
- idea springboot热部署无效问题
Intellij IDEA 使用Spring-boot-devTools无效解决办法 springboot项目中遇到的bug <dependencies> <!--spring bo ...
- 自己总结的C#编码规范--前言&目录
最近在为公司编写c#编码规范,以前对这方面研究不多,只是觉得代码能够出自己的意思就可以了. 我参考了以下资料 C# Coding Conventions NET设计规范约定惯用法与模式(第2版) 编写 ...