Il est possible d'exporter des classes d'une dll (MFC en liaison non statique est fait comme cela).
Mais comme en c++ il a de la décration de nom (le nom des fonctions et méthodes réellement exportées contiennent des informations sur la classe, les accès, les type de paramètres...) et que cette décoration est propre à chaque compilo, la dll et le .lib généré ne seront utilisable qu'avec le même compilo.
exemple :
MyDll.h
#ifndef MYDLL_H
#define MYDLL_H
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
class MYDLL_API CDllClass
{
public :
void HelloWorld();
};
#endif // MYDLL_H
MyDll.cpp
#include <windows.h>
#define MYDLL_EXPORTS
#include "MyDll.h"
void CDllClass::HelloWorld()
{
MessageBox(NULL, "Hello World", "MyDll", MB_OK);
}
TestDll.cpp
#include <windows.h>
#include "MyDll/MyDll.h"
#pragma comment(lib, "MyDll.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
CDllClass dllobj;
dllobj.HelloWorld();
return 0;
}
Explications :
- MYDLL_EXPORTS doit être défini au début de tous les fichiers sources de la dll (peut être mis dans les options de compilation)
- MyDll.lib doit être rajouté au librairie du linker (avec le #pragma ou dans les options de link).
- MyDll.dll sera chargée automatiquement au démarrage du prog et doit se trouver dans le même répertoire que l'exe.
Avec Visual, il y a un outils appelé depends.exe qui permet de voir les fonctions exportées d'une dll. Si tu ouvres MyDll.dll avec ce prog, et que tu as compilé avec Visual 6.0 tu devrais avoir 2 fcts exportées du genre :
??4CDllClass@@QAEAAV0@ABV0@@Z
?HelloWorld@CDllClass@@QAEXXZ
ce qui correspond aux méthodes suivantes si tu active l'option C++ (versions 2.1 de depends)
class CDllClass & CDllClass::operator=(class CDllClass const &)
void CDllClass::HelloWorld(void)