VC导出类得创建和使用

VC++编写DLL导出函数及其调用方法 DLL (Dynamic Link Library)动态链接库,是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,其优点主要有:1. 有助于节省内存;2. 有助于资源共享;3. 不需编译的软件系统升级;4. 支持多语言程序。当然,有的时候我们也可以将一些核心的或者不愿意公开提供的函数编写为DLL,从而起到隐藏和保护的作用。 下面结合实例详细说明在Visual Studio 阅读详情

richTextEditor" class="mceEditor" style="height:450px;width:100%;">

 一、DLL的不同类型
    使用MFC可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。
1、MFC扩展DLL
   每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。
   Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。
2、常规DLL
   使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。
   当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。 
二、建立DLL
    利用Visual C++提供的向导功能可以很容易建立一个不完成任何实质任务的DLL,这里就不多讲了,主要的任务是如何给DLL添加功能,以及在客户程序中利用这个DLL
1、导出类
   用向导建立好框架后,就可以添加需要导出类的.cpp .h文件到DLL中来,或者用向导创建C++ Herder File/C++ Source File。为了能导出这个类,在类声明的时候要加“_declspec(dllexport)”,如:
class _declspec(dllexport) CMyClass
{
     ...//声明
}
如果创建的MFC扩展DLL,可以使用宏:AFX_EXT_CLASS:
class AFX_EXT_CLASS CMyClass
{
     ...//声明
}
这样导出类的方法是最简单的,也可以采用.def文件导出,这里暂不详谈。
2、导出变量、常量、对象
   很多时候不需要导出一个类,可以让DLL导出一个变量、常量、对象,导出它们只需要进行简单的声明:_declspec(dllexport) int MyInt;
  _declspec(dllexport) extern const COLORREF MyColor=RGB(0,0,0);
  _declspec(dllexport) CRect rect(10,10,20,20);
要导出一个常量时必须使用关键字extern,否则会发生连接错误。
注意:如果客户程序识别这个类而且有自己的头文件,则只能导出一个类对象。如果在DLL中创建一个类,客户程序不使用头文件就无法识别这个类。
  当导出一个对象或者变量时,载入DLL的每个客户程序都有一个自己的拷贝。也就是如果两个程序使用的是同一个DLL,一个应用程序所做的修改不会影响另一个应用程序。
  我们在导出的时候只能导出DLL中的全局变量或对象,而不能导出局部的变量和对象,因为它们过了作用域也就不存在了,那样DLL就不能正常工作。如:
MyFunction()
{
      _declspec(dllexport) int MyInt;
      _declspec(dllexport) CMyClass object;
}
3、导出函数
导出函数和导出变量/对象类似,只要把_declspec(dllexport)加到函数原型开始的位置:
_declspec(dllexport) int MyFunction(int);
如果是常规DLL,它将和C写的程序使用,声明方式如下:
extern "c" _declspec(dllexport) int MyFunction(int);
实现:
extern "c" _declspec(dllexport) int MyFunction(int x)
{
     ...//操作
}
如果创建的是动态连接到MFC代码库DLL的常规DLL,则必须插入AFX_MANAGE_STATE作为导出函数的首行,因此定义如下:
extern "c" _declspec(dllexport) int MyFunction(int x)
{
     AFX_MANAGE_STATE(AfxGetStaticModuleState());
     ...//操作
}
有时候为了安全起见,在每个常规DLL里都加上,也不会有任何问题,只是在静态连接的时候这个宏无效而已。这是导出函数的方法,记住只有MFC扩展DLL才能让参数和返回值使用MFC的数据类型。
4、导出指针
导出指针的方式如下:
_declspec(dllexport) int *pint;
_declspec(dllexport) CMyClass object = new CMyClass;
如果声明的时候同时初始化了指针,就需要找到合适的地方类释放指针。在扩展DLL中有个函数DllMain()。(注意函数名中的两个l要是小写字母),可以在这个函数中处理指针:
# include "MyClass.h"
_declspec(dllexport) CMyClass *pobject = new CMyClass;
DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        .....//
    }
    else if(dwReason == DLL_PROCESS_DETACH)
    {
        delete pobject;
    }
}
常规DLL有一个从CWinApp派生的类对象处理DLL的开和关,可以使用类向导添加InitInstance/ExitInstance函数。
int CMyDllApp::ExitInstance()
{
    delete pobject;
    return CWinApp::ExitInstance();
}
三、在客户程序中使用DLL
    编译一个DLL时将创建两个文件.dll文件和.lib文件。首先将这两个文件复制到客户程序项目的文件夹里,这里需要注意DLL和客户程序的版本问题,尽量使用相同的版本,都使用RELEASE或者都是DEBUG版本。
   接着就需要在客户程序中设置LIB文件,打开Project Settings--->Link--->Object/library Modules中输入LIB的文件名和路径。如:Debug/SampleDll.lib。除了DLL和LIB文件外,客户程序需要针对导出类、函数、对象和变量的头文件,现在进行导入添加的关键字就是:_declspec(dllimport),如:
_declspec(dllimport) int MyFunction(int);
_declspec(dllimport) int MyInt;
_declspec(dllimport) CMyClass object;
extern "C" _declspec(dllimport) int MyFunction(int);
在有的时候为了导入类,要把相应类的头文件添加到客户程序中,不同的是要修改类声明的标志:
class _declspec(dllimport) CMyClass,如果创建的是扩展DLL,两个位置都是:
class AFX_EXT_CLASS CMyClass。

 

四、一个完整的例子

 

运行时动态链接导出类
    1)   把所有需要用到的接口收集起来,写一个虚的基类,即所有成员函数都声明成虚函数,且该接口类不带任何数据成员   
    2)   让需要导出的类从该接口类派生,不必导出了。   
    3)   导出一个全局的C接口创建该类,即返回接口类的指针   
//dll项目中的:
//文件ivcscomm.h
struct IVcscomm
{
 virtual int Testa(int a)=0;//必须加上=0
};

//文件vcomm.h

#include "ivcscomm.h"

class Vcomm : public IVcscomm
{
public:
 Vcomm(void);
public:
 ~Vcomm(void);
public:
 int Testa(int a);

};


//文件vcomm.cpp

#include "Vcomm.h"

Vcomm::Vcomm(void)
{
}

Vcomm::~Vcomm(void)
{
}

int Vcomm::Testa(int a)
{
 return 5*a;
}

#define DllExport   __declspec( dllexport ) 
extern "C" DllExport IVcscomm* createIVcscomm()
{
 return new Vcomm();
}


//使用dll的程序:
//在头文件中
#include "IVcscomm.h"

 typedef IVcscomm* (* LPFNDLLFUNC2)();

//在cpp中使用
 HINSTANCE hDLL = LoadLibrary(_T("Dlla")); // Handle to DLL
 if (hDLL != NULL)
 {
  Log(_T("hDLL != NULL"));
  LPFNDLLFUNC2 lpfnDllFunc2 = (LPFNDLLFUNC2)GetProcAddress(hDLL, "createIVcscomm");
  if (!lpfnDllFunc2)
  {
   // handle the error
   FreeLibrary(hDLL);
   Log(_T("!lpfnDllFunc2"));
   return;
  }
  else
  {
   // call the function
   IVcscomm* pcmm = lpfnDllFunc2();
   int uReturnVal = pcmm->Testa(5);
   CString ln;
   ln.Format(_T("uReturnVal==%d"), uReturnVal);
   Log(ln);
   FreeLibrary(hDLL);
   return;
  }
 }
MFC 扩展DLL(导出类) 教你首次使用 MFC 扩展DLL(导出类)的Demo 立即下载

相关推荐

MFC扩展DLL

关于VC++ MFC扩展DLL的应用,MFC类库使用方法

MFC DLL向导(一)

    虽然能用DLL实现的东西都可以用COM来实现,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用MFC来创建不同类型的DLL,以及如何使用他们。一、DLL的不同类型    使用MFC可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。1、MFC扩展DLL   每个D

C++、.NET、WPF、Android 2749

ESP32学习,驱动LED点阵屏,SD卡播放GIF动图

搬运就可以实现效果,如果有不足,请批评指正。下步该学一下如何文章上视频了,老是截图不方便展示效果。

u011625956的博客 1868

VC++动态链接库编程之MFC扩展 DLL

前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细分析DLL的最后一种类型――MFC扩展DLL。   6.1概论  MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应用程序的接口可以是MFC的。MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。MFC扩展DLL使用MF

fxpopboy的博客 1225

阿里云CDN HTTPS 证书配置流程

可以使用HTTPS方式访问资源,如果浏览器中URL旁边出现锁的HTTPS标识,表示HTTPS安全加速已生效。: 证书配置完成后,需要留意证书过期时间并在证书过期前手动配置新的证书。注意 ⚠️ 一定是需要复制 以下标识之间的内容。如果已在阿里云数字证书管理服务中购买了证书,请选择。,该证书将在阿里云数字证书管理服务中保存。如果使用第三方服务商签发的证书,请选择。第四步,在指定域名的左侧导航栏,单击。第二步,在左侧导航栏,单击。开关,并配置证书相关参数。页面,找到目标域名,单击。中选择已购买的证书。

w风雨无阻w的专栏 2209

tcllib2.0 package - csv

tcl lib 的csv库

shin 859

VC导出类得创建和使用 ,有例程

一、DLL的不同类型     使用MFC可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 1、MFC扩展DLL    每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出

haizhongyun的专栏 620

【脚本篇】---spyglass lint脚本

【代码】【脚本篇】---spyglass lint脚本。

冬瓜 6356

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

本文转自:http://hi.baidu.com/ah_leo/blog/item/eccf12f49a0ebce07709d744.html   通常我们在vc程序时候,希望把自己的代码隐藏起来,做成dll的形式,在一个应用程序中调用,现在我就使用win32dll导出类的例程介绍给大家如何使用。开发环境:vs2008 第一,打开vc2008 创建一个名为SayHello的Win32 DLL

优秀技术文章收录 5705

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景,同时使用 OpenCV-Python 实战讲解图像处理基础要点。

盼小辉丶的博客 27万+

第一部分:VTK基础入门(第1章:VTK简介与概述)

VTK简介与核心特性概述 VTK(Visualization Toolkit)是一个开源的跨平台C++类库,专用于3D计算机图形学、图像处理和科学可视化。由Kitware公司开发,VTK自1993年起源以来,经历了开源化、成熟化和现代化多个发展阶段,现已成为科学可视化的核心工具之一。 VTK的核心特性包括: 管道架构:模块化设计实现数据流管理 丰富的数据支持:处理多边形数据、图像数据等 强大的渲染能力:集成OpenGL,支持多种渲染技术 最新版本VTK 9.4.2增强了现代C++支持,优化了内存管理,并提升

仰望星空的博客 2360

编译VC++类的动态链接库DLL 导出类及其中的函数

如果已经写好了一个C++的类,希望把它做成dll动态链接库,这里介绍一种简单的方法。      1、制作dll      利用VC6新建工程时选择win32 dynamic-Link Library,然后添加头文件和cpp文件。假设类名为exp,添加头文件exp.h,头文件中声明类的定义,添加exp.cpp,其中是成员函数的具体定义。与一般写类的定义不同,在exp.h中需要写成  cla

liqunsoft的专栏 1422

企业AI Agent的多模态学习在用户体验优化中的应用

本文旨在为企业技术团队提供关于多模态AI Agent在用户体验优化领域的全面技术指南。多模态学习如何突破传统单模态AI的局限性企业级AI Agent的系统架构设计原则多模态特征融合的工程实现细节用户体验度量的量化方法实际部署中的性能优化策略研究范围涵盖计算机视觉、自然语言处理、语音识别等多个AI子领域的技术融合,以及它们在电商、金融、医疗等行业的应用实践。首先介绍多模态学习的核心概念和技术原理然后深入分析关键算法和数学模型接着通过完整项目案例展示实际应用。

大模型应用工坊 706

动态链接库的制作和使用 (1)

1.    建立动态链接库项目 : (1)VC 6.0 : File -> New -> Project -> Win32 Dynamic-Link Library (输入项目名称Dll1) -> OK -> 选中An empty Dll Project -> Finish .(2)VC 2003 : 文件 -> 新建 -> 项目 -> Visual C++ 项目 -> Win 32

dengniancai的专栏 811

AI游戏制作07——波次计时器,敌人按波次生成

AI游戏制作07——波次计时器,敌人按波次生成

qq_40572023的博客 47

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C#创建COM组件

本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用。 附:本文适用任何VS系列工具。 在用C#创建COM组件时,一定要记住以下几点: 1。所要导出的类必须为公有; 2。所有属性、方法也必须为公有; 3。要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用; 4。所有的事件也必须用...

377

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用VC6.0开发COM组件 - 傻瓜式,不讲理论,只讲实例

2. 选择 Dynamic link Library (DLL),其它两个请百度,或参照其它文档。IID_IUnknown, // 想取得 IUnknown 接口指针。CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载。3. 添加一个自己的COM类,用于导出需要用到的接口。//(2)创建实例对象,获取IUnknown接口指针。printf("没注册吧\n");多了一个接口和一个类,这都是你刚才添加的。然后运行一下就可以看到效果了。

自学C++,会写HelloWorld 1127

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

把C++类做成dll

在学windows程序设计时,学会了把函数做成动态链接库。学完C++后,也想过把类做成dll,但当时一直认为只能导出函数,怎么可能导出一个类呢。网上一查确实可以把C++类做成dll,冷静一分析,感觉这样做成的dll肯定也是利用以前导出单个函数一样的技术。毕竟类里的函数与类外的全局

j123kaishichufa的专栏 7282

把vc中的类封装成dll的简单方法

如果已经写好了一个C++的类,希望把它做成dll动态链接库,这里介绍一种简单的方法。      1、制作dll     利用VC6新建工程时选择win32 dynamic-Link Library,然后添加头文件和cpp文件。假设类名为exp,添加头文件exp.h,头文件中声明类的定义,添加exp.cpp,其中是成员函数的具 体定义。与一般写类的定义不同,在exp.h中需要写成 class __...

weixin_34090643的博客 139

一步一步教你用VC和VB调用C++ DLL

你好,Step by Step: Calling C++ DLLs from VC++ and VB 一步一步教你用VC和VB调用C++ DLL. 作者 Hans Dietrich 翻译烟灰 介绍 本系列教程讨论了普通情况下4种使用DLL的方法 Part 1 从VC++应用程序调用C++ DLL的函数 从VC++应用程序调用C++ DLL的类 Part 2 从VB应用程序调用C

ljx0305的专栏 2010

谈谈vc如何写dll(封装性,隐藏头文件,私有成员)

最近项目进行到一定阶段,老板要求把已完成部分分离开并把各模块封装成dll。用vs开发dll当然很简单,是用vs的向导可以很快写一个dll.但是我遇到了一些问题:刚开始只需要把各个模块的头文件和cpp加入到一个新的dll工程,然后又把导出类的成员函数和成员变量用到的结构体类型、类类型定义的头文件加进来,编译后dll就写出来了。问题是当我要使用这个dll时我就得把所有的相关头文件包含到引用dll的工程

机器视觉之家 2797

DLL应用小结

 该篇文章主要指dll的显式调用,包括函数的调用和类的调用。静态调用比较简单我也会稍微讲一下。一、建立dll文件dll文件的建立其实比较简单。就以VC6.0为开发工具建立一个动态链接库的工程。如下: ///////MyDll.h/////#ifdef MYDLL_EXPORTS#define MYDLL_API __declspec(dllexport)#else#define M

yanshen6的专栏 933

vc编写Dll文件和调用的方法

一、用vc编写dll文件 首先建立一个Win32 Dynamic-Link Library工程,在工程中添加要写的代码。 注意:与普通工程不同的是在dll工程中声明函数或者类时要在前面写上_declspec(dllexport),如: class _declspec(dllimport) student { }  // 声明 c语言的导出格式为extern "C" _declspec(dl

daregone_3824的专栏 619

c++类封装成dll

如果已经写好了一个C++的类,希望把它做成dll动态链接库,这里介绍一种简单的方法。  利 用VC6新建工程时选择win32 dynamic-Link Library,然后添加头文件和cpp文件。假设类名为exp,添加头文件exp.h,头文件中声明类的定义,添加exp.cpp,其中是成员函数的具 体定义。与一般写类的定义不同,在exp.h中需要写成  class __declspec(dlle

ToConnection的专栏 4214

BCB编写DLL终极手册

<br /><br />BCB编写DLL终极手册<br />一. 编写 DLL <br />File/New/Dll 生成 Dll 的向导,然后可以添加导出函数和导出类 <br />导出函数:extern "C" __declspec(dllexport) ExportType FunctionName(Parameter) <br />导出类:class __declspec(dllexport) ExportType ClassName{...} <br />例子:(说明:只是生成了一个 DLL.dll

天道酬勤 952
上一篇: Linux下通用线程池的创建与使用
下一篇: 单元测试工具Numega
一劳永逸
博客等级 码龄20年 101粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值