J'ai une DLL simple:
dllmain.cpp:
#define MYDLLDIR
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
...
}
void callByPtr(int *i) {
(*i)++;
}
pch.h
#include "framework.h"
#ifdef MYDLLDIR
#define DLLDIR __declspec(dllexport) __stdcall
#else
#define DLLDIR __declspec(dllimport)
#endif
extern "C" {
DLLDIR void callByPtr(int *i);
};
Client:
typedef void(__stdcall* callByPtr)(int*);
int main()
{
HINSTANCE hDLL;
hDLL = LoadLibrary(_T("MyDll.dll"));
if (NULL != hDLL)
{
callByPtr myCall = (callByPtr)GetProcAddress(hDLL, "callByPtr");
if (!myCall) {
return EXIT_FAILURE;
}
int i = 10;
int* ptri = &i;
std::cout << "i " << i << std::endl;
std::cout << "ptri " << ptri << std::endl;
myCall(ptri);
std::cout << "---- After Call ----\n";
std::cout << "i " << i << std::endl;
std::cout << "ptri " << ptri << std::endl;
}
}
Résultat:
---- Avant l'appel ----
i = 10
ptri = 0025FB40
---- Après l'appel ----
i = 11286192
ptri = 0025FB3C
L'adresse de ptri a changé et la valeur n'était pas 11.
Comment implémenter cela correctement afin que je puisse obtenir une valeur de DLL en utilisant la méthode ci-dessus?
Je vous remercie!
Vos définitions d'exportation ne sont pas non plus correctes. Devrait être quelque chose comme:
#ifdef MYDLL_EXPORT
#define MYDLLDIR __declspec(dllexport)
#else
#define MYDLLDIR __declspec(dllimport)
#endif
et utilisez la même macro (MYDLLDIR) pour l'exportation (dll, #MYDLL_EXPORT défini) et l'importation (clients, #MYDLL_EXPORT NON défini)
Vous devez utiliser la même convention d'appel pour callByPtr à tous les endroits, dans votre cas __stdcall (la convention par défaut est __cstdcall).
Dans votre pch.h alors:
MYDLLDIR void __stdcall callByPtr(int *i);
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots