C++类导出及显式调用方法

本文详细介绍了如何使用C++的面向对象特性将类导出为DLL动态链接库,并进行显式调用。通过创建一个算法类ALG,声明其接口,然后在子类ScratchDetectALG中实现并导出,最后在主程序中通过LoadLibrary和GetProcAddress函数调用DLL中的类方法。这种方法减少了对外部头文件的依赖,增强了代码的封装性和安全性。
摘要由CSDN通过智能技术生成

C++ 类导出及其显式调用

1. 概述

本文介绍一种利用C++面向对象的继承特性与多态特性对类进行导出为动态链接库DLL及显式调用,该种导出方法可以减少在调用时对头文件的依赖,更好地隐藏信息。本文由两部分组成,即类的导出和DLL的显式调用,以算法类ALG的封装及调用进行讲解说明。

2. C++ 类的导出

C++ 类的导出由三部分组成,即父类ALG的申明、子类ScratchDetectALG的声明及实现、子类ScratchDetectALG的导出

2.1 父类ALG的申明

根据实际接口需求,申明ALG的公有函数。

// ALG.h

#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

class ALG
{
public:
	virtual bool inital(const string& enginePath) = 0;
	virtual void detect(const Mat& inputImg, vector<Rect>& vRect)=0;
};
2.2 子类ScratchDetectALG的声明及实现

子类ScratchDetectALG继承父类ALG,然后进行实现。

ScratchDetectALG的声明

// ScratchDetectALG.h

#include <iostream>
#include <opencv2/opencv.hpp>
#include "ALG.h"

class ScratchDetectALG:public ALG
{
public:
	ScratchDetectALG();
	~ScratchDetectALG();

	bool inital(const string& enginePath);
	void detect(const Mat& inputImg, vector<Rect>& vRect);
};

ScratchDetectALG的实现

// ScratchDetectALG.cpp

#include "ScratchDetectALG.h"
ScratchDetectALG::ScratchDetectALG()
{
}
ScratchDetectALG::~ScratchDetectALG()
{
}
bool ScratchDetectALG::inital(const string& enginePath)
{
    // your task
	return true;
}
void ScratchDetectALG::detect(const Mat& inputImg, const InputParam4Yolo& inpara, ResultData4Yolo& resData)
{
    // your task
}
2.3 子类ScratchDetectALG的导出
// dllexport.h

#ifdef SCRATCHYOLOV5_EXPORTS
#define SCRATCHYOLOV5_API __declspec(dllexport)
#else
#define SCRATCHYOLOV5_API __declspec(dllimport)
#endif

#include "ScratchDetectALG.h"

extern "C"
{
	SCRATCHYOLOV5_API ScratchDetectALG* GetScratchALG();
}

// dllexport.cpp

#include "stdafx.h"
#include "dllexport.h"
#include "ScratchDetectALG.h"

extern "C"
{
	SCRATCHYOLOV5_API ScratchDetectALG* GetScratchALG()
	{
		return new ScratchDetect;
	}
}

3. 类的显式调用

通过第二部分,可以生成YoloV5.dll,下面我们利用ALG.h以该DLL进行显式调用。

#include <iostream>
#include <windows.h>
#include "ALG.h"

// 声明函数指针及其别名
typedef ALG* (*CreateALG)();

int main()
{
	HINSTANCE hDll = LoadLibrary(L"YoloV5.dll");
	if (hDll==NULL)
	{
		cout << "Failed to load DLL." << endl;
        return -1;
	}

	CreateALG creatAlg = reinterpret_cast<CreateALG>(GetProcAddress(hDll, "getALG"));
	if (!creatAlg)
	{
		cout << "unable to load getALG from DLL" << endl;
        return -1;
	}

	ALG* alg;
	alg = creatAlg();

	string path = "E:\\TensorRT PRJ\\YoloV5\\Model\\yolov5s.engine";
	alg->inital(path);
    
    Mat inputImg=imread("myImg.jpg");
    vector<Rect> vRect;
     
	alg->detect(inputImg,vRect);

	return 1;
}

4. 总结

本文介绍了一种类的导出方法,通过这种类的导出方法,可以使代码具有更好的隐蔽性,特别是在类中依赖的头文件较多时,效果更明显。

参考链接:

[Exporting C++ classes from a DLL]

[Exporting a C++ class from a DLL]

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值