2009-02-27 7 views
3

J'ai besoin dans une DLL d'utiliser une classe, définie dans un exécutable (DLL et exécutable sont compilés par le même compilateur). Mais je ne veux pas que le code source de cette définition de classe soit disponible pour la DLL, seule la déclaration.Exporter la classe de l'exécutable vers la DLL

Une façon possible de le faire est de rendre toutes les méthodes de classe nécessaires à virtual (de sorte que l'éditeur de liens DLL n'ait pas besoin des définitions de ces méthodes). Les inconvénients de cette approche:

  1. Je ne peux pas créer des objets de classes exportées dans le code DLL à l'aide new (un devoir créer des fonctions supplémentaires dans le code de exécutable).
  2. Je dois faire toutes ces méthodes virtual, même si autrement ils n'ont pas besoin de être virtual.

Il existe un moyen d'exporter une classe d'une DLL vers un exécutable en utilisant l'attribut étendu __declspec(dllexport) de classe de stockage de Microsoft. Existe-t-il un moyen d'exporter une classe de l'exécutable vers la DLL en utilisant la même technique?

Mon ancien compilateur Borland C 6 ne me permet pas de créer une bibliothèque d'import lors de la construction d'un projet exécutable. (Ainsi, lors de la compilation de la DLL, l'éditeur de liens me donne des messages d'erreur externes non résolus pour toutes les méthodes de classe non virtuelles importées.) Est-ce une limitation de ce même compilateur?

Répondre

3

Pour autant que je sache, il est autorisé à utiliser le dllexport MS VS pour exporter une classe ou fonction d'un exe et de l'utiliser dans une DLL. et il fonctionne cool si votre DLL et Exe exécutent dans un processus.

+0

Oui, vous avez raison. Juste essayé sur MS VS 2008 - il est possible de générer une bibliothèque d'importation pour un exécutable avec tous les symboles __declspec et de le lier avec dll. Donc, il semble que ce soit une limitation de mon ancien compilateur Borland C++ 6.0. Je vous remercie. –

+1

Pour ajouter une note, si vous exportez les symboles en utilisant un fichier DEF de votre exe, votre exe ne pourra plus s'exécuter. –

2

Vous pouvez placer la classe dans une deuxième DLL si vous ne l'avez pas vraiment voulue dans la première.

J'ai du mal à comprendre votre raisonnement pour ne pas simplement mettre la classe dans la DLL.

ETA: certains ont-ils plus creuser et trouvé this link qui explique comment générer une bibliothèque d'importation d'un projet EXE dans Visual Studio 2008. En ce qui concerne la façon de les exporter, il semble que vous utilisez simplement le __declspec régulière (dllexport).

+0

E.g., cette classe représente une API, qui devrait être utilisée dans DLL. La DLL est développée par un tiers. Il y a un problème de «savoir-faire» qui consiste à ne pas laisser les tiers de l'implémentation de l'API à des tiers. Cependant, mettre cette classe API dans une autre DLL ira, merci. –

+0

Il est également possible d'exporter des symboles à partir d'un exécutable. Il doit être, les DLL sont des exécutables. –

+0

Exemple: ntoskrnl.exe a exporté des symboles. – bk1e

0

OK, nouvelle réponse à la lumière de nouvelles informations ici. Si vous ne pouvez pas générer une bibliothèque d'exportation pour votre EXE avec votre compilateur, et que vous devez vraiment le faire de cette façon, voici une solution créative, hacky et généralement non recommandée:

Étape 1: Créer une API C wrapper pour votre classe, un peu comme celui-ci (probablement compilez habitude, mais vous voyez l'idée):

// Yes, need some 32 bit/64 bit checks here 
#define MYHANDLE unsigned int 

__declspec(dllexport) MYHANDLE MyClassNewInstance() { 
    MyClass* ptr = new MyClass(); 
    return (MYHANDLE)ptr; 
} 

__delspec(dllexport) MyClassDoSomething(MYHANDLE handle, int parm) { 
    MyClass* ptr = (MyClass*)handle; 
    ptr->DoSomething(parm); 
} 

etc.. 

Étape 2: pour obtenir effectivement les fonctions C du EXE pour une utilisation dans la DLL, utilisez les fonctions API Win32 GetModuleHandle() et GetProcAddress().

Étape 3: Créez une classe proxy dans votre DLL. Les méthodes de la classe proxy ne font rien mais appellent leurs fonctions C de contrepartie de l'EXE.

Ceci garderait la "vraie" implémentation de votre classe hors de la DLL. C'est un hack, mais ça marcherait probablement.

+0

Merci pour votre remplacement! –

Questions connexes