Créer Des Dlls qui implémentent des fonctions spécifiques (cas des plugins d'orbiter)Le cas des plugins est différent.
En effet comme on l'a vu dans le premier post, l'exe qui charge ses plugins charge la dll manuellement via un LoadLibrary puis recherche les éventuelles fonctions qu'il avait définit avec GetProcAdress.
La liste de ces fonctions est souvent limitée et définit par l'exécutable.
dans notre cas c'est orbiter. Il définit entre autre
* InitModule, ExitModule,
* ovcInit et ovcExit pour les vaisseaux
* opcPreStep appelé à chaque boucle,
* opcPause quand on met en pause,
* opcTimeAccChange quand on chaque l'accélération temporaire
etc etc.
je vous invite à lire le chapitre 7.64 et les suivants de la doc d'orbiter 2010 pour plus de détail pour ces fonctions
Pour les implémenter, il vous suffit de copier la définition précise qui se trouve dans la doc et de les coller dans un fichier .c ou .cpp
ex :
DLLCLBK void InitModule(HINSTANCE hmodule)
{
// mon code d'init ici
}
la macro DLLCLBK est définie par orbiter et vaut
extern "C" __declspec (dllexport)
ce qui signifie qu'on exporte cette fonction au format "C"
DllMain, à quoi ca sert ?La fonction DllMain est une fonction générale de toutes les Dll qui permet de contrôler le chargement déchargement de celle ci.
Les premières version d'orbiter utilisaient ce fonctionnement, mais depuis quelques temps Martin a remplacé ce mécanisme par les fonction InitModule et ExitModule.
Mais ce procédé fonctionne toujours et on retrouve encore pas mal de projet qui l'utilisent pour déclarer leurs plugins
Voici le lien vers la doc Microsoft de la fonction ainsi que toute les valeurs que windows envoie à la dll pour notifier de tous les changements d'état.
http://msdn.microsoft.com/en-us/library/ms682583%28VS.85%29.aspxMais cette fonction n'est pas indispensable, loin de là.
Par défaut visual c++ en génère une si on n'en déclare pas.
Donc à moins de vraiment vouloir tout maitriser il n'est pas nécessaire de s'en préoccuper.
Message modifié ( 04-10-2010 15:13 )