乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【C++】多個(gè)類的DLL封裝及調(diào)用

       imelee 2017-10-10

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


      項(xiàng)目中需要把一些共通的功能,抽出來做一個(gè)dll來調(diào)用。因?yàn)槭且灶愖鳛閱挝坏?,資料確實(shí)少,主要參考了上面那篇博文。需要補(bǔ)充的一點(diǎn)是:程序能夠正常調(diào)用,但是偶爾會(huì)發(fā)生accessviolationException,查到的結(jié)果是,函數(shù)聲明時(shí)未添加_stdcall,導(dǎo)致缺省調(diào)用了_cdeccall。

      具體解釋如下:

      一般dll中的函數(shù)都采用extern "C" __stdcall的方式引出函數(shù)接口的,在調(diào)用DLL中的函數(shù)時(shí),如果沒有加__stdcall和__cdecall時(shí),缺省調(diào)用了__cdecall,而__cdecall是要由調(diào)用者清理堆棧的,而在代碼中并沒有清理堆棧的操作,只是調(diào)用了函數(shù),所以調(diào)用函數(shù)的地址可能會(huì)跑飛。不跑飛就OK,而一旦跑飛就出現(xiàn)Access violation的異常。而_stdcall是由被調(diào)用的函數(shù)清理堆棧,所以調(diào)用函數(shù)的地址不會(huì)跑飛,自然也就OK了。


      創(chuàng)建DLL

      在VS2010中新建一個(gè)win32->dll工程。如我建立的工程名為FaceDLL

      添加facedll.h的頭文件(里面定義dll的接口,調(diào)用時(shí)會(huì)用到)

      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. //類的函數(shù)    
      18.     
      19. };  

      之后在facedll.cpp中寫函數(shù)實(shí)現(xiàn),而且要定義為 FaceLIBDLL

      1. #define FaceLIBDLL    
      2.     
      3. #include "stdafx.h"    
      4. #include "facedll.h"    
      5. #include <opencv2/opencv.hpp>    
      6.     
      7. //////////頭文件中函數(shù)的實(shí)現(xiàn)    
      8. FaceRecognizer::FaceRecognizer()     
      9. {       
      10.     
      11. }     
      12.     
      13. FaceRecognizer::~FaceRecognizer()     
      14. {       
      15.     
      16. }   

      生成(Build)工程,在debug文件夾中會(huì)生成相應(yīng)的DLL及LIB文件:facedll.dll   facedll.lib

      多個(gè)類封裝DLL

      封裝好一個(gè)類之后,在后面的類可以調(diào)用這個(gè)類生成的dll,再封裝新類的dll。

      需要在工程中添加需要引用的頭文件,如facedll.h。在debug中拷貝facedll.lib文件。在 Properties->Linker->Input->  Additional Dependecies中添加facedll.lib(或?qū)懭窂剑?..\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. }  

      調(diào)用DLL

      調(diào)用需要各個(gè)dll的.h、.dll、.lib文件。
      將頭文件添加到工程中,并#include到需要用的地方。將lib文件拷貝到項(xiàng)目中,并在 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();    



        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多