分享

【C++】多个类的DLL封装及调用

 imelee 2017-10-10

原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/7737682


项目中需要把一些共通的功能,抽出来做一个dll来调用。因为是以类作为单位的,资料确实少,主要参考了上面那篇博文。需要补充的一点是:程序能够正常调用,但是偶尔会发生accessviolationException,查到的结果是,函数声明时未添加_stdcall,导致缺省调用了_cdeccall。

具体解释如下:

一般dll中的函数都采用extern "C" __stdcall的方式引出函数接口的,在调用DLL中的函数时,如果没有加__stdcall和__cdecall时,缺省调用了__cdecall,而__cdecall是要由调用者清理堆栈的,而在代码中并没有清理堆栈的操作,只是调用了函数,所以调用函数的地址可能会跑飞。不跑飞就OK,而一旦跑飞就出现Access violation的异常。而_stdcall是由被调用的函数清理堆栈,所以调用函数的地址不会跑飞,自然也就OK了。


创建DLL

在VS2010中新建一个win32->dll工程。如我建立的工程名为FaceDLL

添加facedll.h的头文件(里面定义dll的接口,调用时会用到)

  1. #pragma once    
  2. #ifdef FaceLIBDLL    
  3. #define FACEAPI _declspec(dllexport)    
  4. #else    
  5. #define FACEAPI  _declspec(dllimport)    
  6. #endif    
  7. //可以include需要用到的头文件    
  8. #include <opencv2/opencv.hpp>    
  9.     
  10. class FACEAPI  FaceRecognizer    
  11. {    
  12. public:    
  13.     FaceRecognizer();    
  14.     ~FaceRecognizer();    
  15.     
  16. /////////////////////////////////////    
  17. //类的函数    
  18.     
  19. };  

之后在facedll.cpp中写函数实现,而且要定义为 FaceLIBDLL

  1. #define FaceLIBDLL    
  2.     
  3. #include "stdafx.h"    
  4. #include "facedll.h"    
  5. #include <opencv2/opencv.hpp>    
  6.     
  7. //////////头文件中函数的实现    
  8. FaceRecognizer::FaceRecognizer()     
  9. {       
  10.     
  11. }     
  12.     
  13. FaceRecognizer::~FaceRecognizer()     
  14. {       
  15.     
  16. }   

生成(Build)工程,在debug文件夹中会生成相应的DLL及LIB文件:facedll.dll   facedll.lib

多个类封装DLL

封装好一个类之后,在后面的类可以调用这个类生成的dll,再封装新类的dll。

需要在工程中添加需要引用的头文件,如facedll.h。在debug中拷贝facedll.lib文件。在 Properties->Linker->Input->  Additional Dependecies中添加facedll.lib(或写全路径:"..\debug\facedll.lib")

然后一样的方法再封装新的类就可以了~

  1. #pragma once    
  2. #ifdef HEARTLIBDLL    
  3. #define HEARTAPI _declspec(dllexport)    
  4. #else    
  5. #define HEARTAPI  _declspec(dllimport)    
  6. #endif    
  7.     
  8. #include <opencv2/opencv.hpp>    
  9. #include "facedll.h"    
  10. #include "datadll.h"    
  11.     
  12. class HEARTAPI  HRMeasure    
  13. {    
  14. }  

调用DLL

调用需要各个dll的.h、.dll、.lib文件。
将头文件添加到工程中,并#include到需要用的地方。将lib文件拷贝到项目中,并在 Properties->Linker->Input->  Additional Dependecies 中写入:facedll.lib;heartdll.lib。
或者在程序中写入:
  1. #pragma  comment(lib,"facedll.lib")    
  2. #pragma  comment(lib,"heartdll.lib")    
之后程序中就可以直接使用封装成DLL的类了:
  1. HRMeasure *hrMea=new HRMeasure();    



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多