原文地址: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的接口,调用时会用到)
#pragma once
#ifdef FaceLIBDLL
#define FACEAPI _declspec(dllexport)
#else
#define FACEAPI _declspec(dllimport)
#endif
//可以include需要用到的头文件
#include <opencv2/opencv.hpp>
class FACEAPI FaceRecognizer
{
public:
FaceRecognizer();
~FaceRecognizer();
/
//类的函数
};
之后在facedll.cpp中写函数实现,而且要定义为 FaceLIBDLL
#define FaceLIBDLL
#include "stdafx.h"
#include "facedll.h"
#include <opencv2/opencv.hpp>
//头文件中函数的实现
FaceRecognizer::FaceRecognizer()
{
}
FaceRecognizer::~FaceRecognizer()
{
}
生成(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")
然后一样的方法再封装新的类就可以了~
#pragma once
#ifdef HEARTLIBDLL
#define HEARTAPI _declspec(dllexport)
#else
#define HEARTAPI _declspec(dllimport)
#endif
#include <opencv2/opencv.hpp>
#include "facedll.h"
#include "datadll.h"
class HEARTAPI HRMeasure
{
}
调用DLL
#pragma comment(lib,"facedll.lib")
#pragma comment(lib,"heartdll.lib")
之后程序中就可以直接使用封装成DLL的类了:
HRMeasure *hrMea=new HRMeasure();