机器视觉系列2:VS动态链接库DLL调试

系列文章目录

第一章:Visual Studio 2019 动态链接库DLL建立

第二章:VS动态链接库DLL调试


目录

系列文章目录

前言

二、调试DLL

1.隐式调用/静态调用

1.1 文件设置

1.2 编写C++调试代码

1.3 更改解决方案启动项目

2.显式调用

总结


前言

上章完成了DLL的建立,但DLL只有在被调用时才会执行,本章记录在同一解决方案中用C++项目调式DLL的过程。


一、新建C++项目?

在同一个解决方案资源管理器,右击解决方案——添加——新建项目——添加空项目

机器视觉系列2:VS动态链接库DLL调试_第1张图片

二、调试DLL

1.隐式调用/静态调用

1.1 文件设置

        把DLL目录下的.h文件和DLL编译生成的.lib文件复制到C++项目的.cpp同一目录下

        机器视觉系列2:VS动态链接库DLL调试_第2张图片

        可以使用Windows软链接映射文件,这样不用每次生成都要复制

New-Item -ItemType SymbolicLink -Path 原文件路径 -Target 目标文件路径

1.2 编写C++调试代码

        需要更改的地方        

  •         更改头中的两个引入

                #include "dedip.h"

                 #pragma comment(lib, "dedip.lib")

  •         更改外部函数

                extern "C" __declspec(dllimport) bool eyeCloseCheck(BYTE*, int, int, int);

  •         更改调用时的函数

                cout << eyeCloseCheck(buffer, width, height, VailImgNum) << endl;

#include 
#include 
#include 
#include "dedip.h" 
#pragma comment(lib, "dedip.lib")
#include 

using namespace cv;
using namespace std;

extern "C" __declspec(dllimport) bool eyeCloseCheck(BYTE*, int, int, int);

int main()
{
	Mat srcImg = imread("D:/ImgEnglish/redeye_img_test/1.bmp");
	int width = srcImg.cols;
	int height = srcImg.rows;

	//imshow("1", srcImg);
	//waitKey(0);

	//DLL调试
	int length = (int)(srcImg.total() * srcImg.elemSize());
	BYTE* buffer = new BYTE[length];
	memcpy(buffer, srcImg.data, length * sizeof(BYTE));
	int VailImgNum = 1;
	cout << eyeCloseCheck(buffer, width, height, VailImgNum) << endl;

	//imshow("2", OutImg);
	//waitKey(0);
}

1.3 更改解决方案启动项目

        右击项目——设为启动项目

机器视觉系列2:VS动态链接库DLL调试_第3张图片

2.显式调用

显示调用比较麻烦,贴一个示例代码,自己参考

大概思路就是不用复制.h和.lib,一个解决方案debug或release时,产生的文件在一个文件夹。

#include 
#include 

void main(void)
{
    typedef int(*MyFunDll)(void);

    HMODULE hdll = LoadLibrary("Win32Project1.dll");   //加载dll文件
    if (hdll != NULL)
    {
        MyFunDll MyFunCall = (MyFunDll)GetProcAddress(hdll, "main");//检索要调用函数的地址
        if (MyFunCall != NULL)
        {
            MyFunCall();							    //调用接口函数
        }
    }

    FreeLibrary(hdll);								    //释放dll文件
}

通过LoadLibrary()函数对dll文件进行加载;再通过GetProcAddress()函数去获取要调用的接口函数的地址(上例中用MyFunCall去存储接口函数的地址);再调用该接口函数(MyFunCall);最后通过FreeLibrary()函数对dll文件进行释放。所以,如果要用于加载其他的dll文件,上例中需改动的地方有:

加载的dll文件名(上例中的"Win32Project1.dll");
要检索的接口函数名(上例中的"main");
调用的接口函数的格式(如上例中的MyFunCall(),函数的参数信息应保持与要调用的接口函数"main"一致)。


总结

总结:隐式调用写代码更方便,但有更改时需要重新复制文件。
引用:https://blog.csdn.net/weixin_44536482/article/details/91519413

           C++编写 动态链接库dll 和 调用dll-百度经验 (baidu.com)

你可能感兴趣的:(机器视觉,c++,图像处理)