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.

Était-ce utile?

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".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top