專案中需要把一些共通的功能,抽出來做乙個dll來呼叫。因為是以類作為單位的,資料確實少,主要參考了上面那篇博文。需要補充的一點是:程式能夠正常呼叫,但是偶爾會發生accessviolationexception,查到的結果是,函式宣告時未新增_stdcall,導致預設呼叫了_cdeccall。
具體解釋如下:
一般dll中的函式都採用extern "c" __stdcall的方式引出函式介面的,在呼叫dll中的函式時,如果沒有加__stdcall和__cdecall時,預設呼叫了__cdecall,而__cdecall是要由呼叫者清理堆疊的,而在**中並沒有清理堆疊的操作,只是呼叫了函式,所以呼叫函式的位址可能會跑飛。不跑飛就ok,而一旦跑飛就出現access violation的異常。而_stdcall是由被呼叫的函式清理堆疊,所以呼叫函式的位址不會跑飛,自然也就ok了。
在vs2010中新建乙個win32->dll工程。如我建立的工程名為facedll
新增facedll.h的標頭檔案(裡面定義dll的介面,呼叫時會用到)
#pragma once
#ifdef facelibdll
#define faceapi _declspec(dllexport)
#else
#define faceapi _declspec(dllimport)
#endif
//可以include需要用到的標頭檔案
#include class faceapi facerecognizer
;
之後在facedll.cpp中寫函式實現,而且要定義為 facelibdll
#define facelibdll
#include "stdafx.h"
#include "facedll.h"
#include //標頭檔案中函式的實現
facerecognizer::facerecognizer()
facerecognizer::~facerecognizer()
生成(build)工程,在debug資料夾中會生成相應的dll及lib檔案:facedll.dll facedll.lib
封裝好乙個類之後,在後面的類可以呼叫這個類生成的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 #include "facedll.h"
#include "datadll.h"
class heartapi hrmeasure
呼叫需要各個dll的.h、.dll、.lib檔案。
將標頭檔案新增到工程中,並#include到需要用的地方。將lib檔案拷貝到專案中,並在 properties->linker->input-> additional dependecies 中寫入:facedll.lib;heartdll.lib。
或者在程式中寫入:
#pragma comment(lib,"facedll.lib")
#pragma comment(lib,"heartdll.lib")
之後程式中就可以直接使用封裝成dll的類了:hrmeasure *hrmea=new hrmeasure();
C 多個類的DLL封裝及呼叫
網上大多是將函式封裝成dll的教程,類的封裝也是基本相似的。在vs2010中新建乙個win32 dll工程。如我建立的工程名為facedll 新增facedll.h的標頭檔案 裡面定義dll的介面,呼叫時會用到 pragma once ifdef facelibdll define faceapi ...
C 多個類的DLL封裝及呼叫
網上大多是將函式封裝成dll的教程,類的封裝也是基本相似的。在vs2010中新建乙個win32 dll工程。如我建立的工程名為facedll 新增facedll.h的標頭檔案 裡面定義dll的介面,呼叫時會用到 pragma once ifdef facelibdll define faceapi ...
多個類的DLL封裝及呼叫
cpp view plain copy define facelibdll include stdafx.h include facedll.h include 標頭檔案中函式的實現 facerecognizer facerecognizer facerecognizer facerecognize...