J'ai commencé à étudier les DLL avec liaison implicite. Je ne comprends pas vraiment comment cela fonctionne. S'il vous plaît corrigez-moi où je me trompe. je ne ai pas compiler le code suivant (3 modules):DLL de liaison implicite question
malib.h
#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
MYLIBAPI int g_nResult;
MYLIBAPI int Add(int nLeft, int nRight);
Pour autant que je comprends est l'en-tête de la DLL. #define MYLIBAPI extern "C" __declspec(dllimport)
signifie qu'ici nous allons déclarer certaines fonctions/variables qui seront décrites dans le fichier .cpp dédié et seront contenues dans une DLL.
MyLibFile1.cpp
#include <windows.h>
#define MYLIBAPI extern "C" __declspec(dllexport)
#include "MyLib.h"
int g_nResult;
int Add(int nLeft, int nRight) {
g_nResult = nLeft + nRight;
return(g_nResult);
}
Donc, cela est évidemment le fichier dans lequel sont mis en œuvre nos fonctions. C'est la partie de la DLL, n'est-ce pas?
MyExeFile1.cpp
#include <windows.h>
#include <strsafe.h>
#include <stdlib.h>
#include "MyLib.h"
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {
int nLeft = 10, nRight = 25;
TCHAR sz[100];
StringCchPrintf(sz, _countof(sz), TEXT("%d + %d = %d"),
nLeft, nRight, Add(nLeft, nRight));
MessageBox(NULL, sz, TEXT("Calculation"), MB_OK);
StringCchPrintf(sz, _countof(sz),
TEXT("The result from the last Add is: %d"), g_nResult);
MessageBox(NULL, sz, TEXT("Last Result"), MB_OK);
return(0);
}
Ainsi, c'est le fichier exécutable où nous utilisons les fonctions de la bibliothèque. Tout ne fonctionne pas. J'ai essayé de mettre tout cela dans un répertoire et de compiler à la fois. J'ai d'abord essayé de compiler une DLL à partir des deux premiers modules (avec succès), puis compiler l'exécutable (en changeant le chemin vers le fichier d'en-tête). Cependant, il a donné lieu à 2 erreurs deux fois:
erreur LNK2019: symbole externe non résolu _WinMain @ 16 référencé dans la fonction ___tmainCRTStartup
\ Visual Studio 2008 \ Projects \ MyExeFile1 \ Debug \ MyExeFile1.exe: LNK1120 erreur fatale: 1 les externals non résolus
Quelle est la bonne façon de faire cela - que dois-je changer dans le code et comment dois-je compiler le code (j'utilise VS2008)? Merci.
Merci .. Je ne comprends pas vraiment ce qui se passe. Si j'ajoute une définition de préprocesseur, quand BUILDING_DLL est-il défini et quand? Quel est le but de cela? Je pense comme ceci: tandis que la DLL n'est pas compilée, le BUILDING_DLL n'est pas défini, donc nous importons les fonctions dans la DLL et après cela? ... (Je vois maintenant que je ne comprends pas du tout les parties de dllimport/dllexport) – lhj7362
Il est # défini lorsque vous ajoutez la définition du préprocesseur. Vous l'avez fait dans le projet DLL, ce qui garantit que la fonction est exportée. Il n'est défini dans aucun autre projet, ce qui garantit que la fonction est importée. –