ne peut pas obtenir l'adresse de la fonction dll avec GetProcAddress
-
29-09-2019 - |
Question
Je créé une dll avec VS C ++ (bien sûr en tant que projet dll) avec le code suivant du fichier d'en-tête:
#pragma once
#include <iostream>
#include "..\..\profiles/ProfileInterface.h"
using namespace std;
extern "C" __declspec(dllexport) class CExportCoordinator: public CProfileInterface
{
public:
CExportCoordinator(void);
virtual ~CExportCoordinator(void);
CProfileInterface* Create();
void Initialize();
void Start();
};
Voici fichier .cpp de la dll:
#include "StdAfx.h"
#include "ExportCoordinator.h"
CExportCoordinator::CExportCoordinator(void)
{
}
CExportCoordinator::~CExportCoordinator(void)
{
}
CProfileInterface* CExportCoordinator::Create(){
cout << "ExportCoordinator3 created..." << endl;
return new CExportCoordinator();
}
void CExportCoordinator::Initialize(){
cout << "ExportCoordinator3 initialized..." << endl;
}
void CExportCoordinator::Start(){
cout << "ExportCoordinator3 started..." << endl;
}
J'exporté toute CExportCoordinator
de classe parce que je dois utiliser les trois méthodes qu'il offre. Voici le code du principal chargement de l'application de la, donnée ci-dessus, dll à la volée.
typedef CProfileInterface* (WINAPI*Create)();
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hLib = LoadLibrary(name);
if(hLib==NULL) {
cout << "Unable to load library!" << endl;
return NULL;
}
char mod[MAXMODULE];
GetModuleFileName(hLib, (LPTSTR)mod, MAXMODULE);
cout << "Library loaded: " << mod << endl;
Create procAdd = (Create) GetProcAddress(hLib,"Create");
if (!procAdd){
cout << "function pointer not loaded";
}
return;
}
Sur la sortie je reçois cette bibliothèque correcte est chargée, mais le pointeur de fonction procAdd
est NULL. Je pensais qu'il avait quelque chose à voir avec le nom mutiler et ajouté extern "C"
lors de l'exportation de la classe en tête de dll, mais rien n'a changé. BTW, je dll export pour visualiser les fonctions exportées de la classe, et classe entière est exportée correctement.
Toute aide?
UPDATE
il y a une erreur dans le fichier d'en-tête de dll. Je ne devrait pas utiliser extern "C" __declspec(dllexport)
avant la classe parce que la classe alors ne sera pas exporté du tout. Si j'utilise class __declspec(dllexport) CExportCoordinator
alors la classe est exportée correctement, mais de toute façon je ne peux pas obtenir l'adresse de la fonction autre que NULL.
La solution
extern "C" __declspec(dllexport) class CExportCoordinator: public CProfileInterface
{
Ceci est un non-sens. Une classe ne peut pas être "C extern"
... inside the class ...
CProfileInterface* Create();
Cela crée une fonction de membre de la classe, ce qui est probablement ce que vous voulez. D'une part, il sera dans la DLL mutilée, d'autre part, il ne sera pas appelable sans ce pointeur. , Dont vous avez besoin sans doute cette déclaration:
extern "C" __declspec(dllexport) CProfileInterface* Create();
et implemntation:
extern "C" __declspec(dllexport) CProfileInterface* Create(){
cout << "ExportCoordinator3 created..." << endl;
return new CExportCoordinator();
}
Autres conseils
Il me semble que vous devez déclarer méthode Create
comme méthode de static
et exporter cette méthode uniquement. Si vous séjournerez à avoir NULL
GetProcAddress
vous devriez examiner les exportations de votre DLL en ce qui concerne la dépendance de Walker (voir http: // www .dependencywalker.com / ) et de modifier le nom de la fonction "Créer" pour quelque chose comme "_create" ou "_create @ 2".