Machine Vision Series 2 : débogage des DLL de la bibliothèque de liens dynamiques VS

Répertoire des articles de la série

Chapitre 1 : Création de la DLL de la bibliothèque de liens dynamiques de Visual Studio 2019

Chapitre deux : Débogage des DLL de la bibliothèque de liens dynamiques VS


Table des matières

Répertoire des articles de la série

avant-propos

Deux, déboguer DLL

1. Appel implicite/appel statique

1.1 Paramètres du fichier

1.2 Écrire du code de débogage C++

1.3 Modification du projet de démarrage de la solution

2. Appel explicite

Résumer


avant-propos

Le chapitre précédent a terminé la mise en place de la DLL, mais la DLL ne sera exécutée que lorsqu'elle sera appelée. Ce chapitre enregistre le processus de débogage de la DLL avec un projet C++ dans la même solution.


1. Créer un nouveau projet C++ ?

Dans le même explorateur de solutions, faites un clic droit sur la solution - Ajouter - Nouveau projet - Ajouter un projet vide

Deux, déboguer DLL

1. Appel implicite/appel statique

1.1 Paramètres du fichier

        Copiez le fichier .h dans le répertoire DLL et le fichier .lib généré par la compilation DLL dans le même répertoire que le .cpp du projet C++

        

        Les fichiers de mappage de liens symboliques Windows peuvent être utilisés afin qu'ils n'aient pas à être copiés à chaque fois qu'ils sont générés

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

1.2 Écrire du code de débogage C++

        ce qu'il faut changer        

  •         Modifier les deux importations dans l'en-tête

                #include "dedip.h"

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

  •         changer la fonction externe

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

  •         Changer la fonction lorsqu'elle est appelée

                cout << eyeCloseCheck(tampon, largeur, hauteur, VailImgNum) << endl ;

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <windows.h>
#include "dedip.h" 
#pragma comment(lib, "dedip.lib")
#include <opencv2/dnn/dnn.hpp>

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 Modification du projet de démarrage de la solution

        Faites un clic droit sur le projet - définir comme projet de démarrage

2. Appel explicite

Il est gênant d'afficher l'appel, de publier un exemple de code et de s'y référer vous-même

L'idée générale est qu'il n'est pas nécessaire de copier .h et .lib. Lorsqu'une solution est déboguée ou publiée, les fichiers générés se trouvent dans un dossier.

#include <stdio.h>
#include <windows.h>

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文件
}

Chargez le fichier dll via la fonction LoadLibrary() ; puis utilisez la fonction GetProcAddress() pour obtenir l'adresse de la fonction d'interface à appeler (dans l'exemple ci-dessus, utilisez MyFunCall pour stocker l'adresse de la fonction d'interface ); puis appelez le fonction d'interface (MyFunCall); enfin Libérez le fichier dll via la fonction FreeLibrary(). Par conséquent, s'il est utilisé pour charger d'autres fichiers dll, les changements dans l'exemple ci-dessus sont les suivants :

Le nom du fichier dll chargé ("Win32Project1.dll" dans l'exemple ci-dessus) ;
le nom de la fonction d'interface à récupérer ("main" dans l'exemple ci-dessus) ;
le format de la fonction d'interface à appeler (comme MyFunCall() dans l'exemple ci-dessus, les informations de paramètre de la fonction doivent être cohérentes avec la fonction d'interface "main" à appeler).


Résumer

Résumé : Il est plus pratique d'écrire du code implicitement, mais vous devez recopier le fichier en cas de modification.
Référence : https://blog.csdn.net/weixin_44536482/article/details/91519413

           C++ écrit une dll de bibliothèque de liens dynamiques et appelle l'expérience dll-Baidu (baidu.com)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42748604/article/details/122634311
conseillé
Classement