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
1. Appel implicite/appel statique
1.2 Écrire du code de débogage C++
1.3 Modification du projet de démarrage de la solution
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)