2010-08-11 4 views
3

Mon programme principal chargeriez une bibliothèque dynamique simple appelé hello.sopartage de données avec une bibliothèque dynamique chargé (dlopen, dlsym)

Dans principale


void* handle = dlopen("./hello.so", RTLD_LAZY); 
 

Dans principale, passez une fonction de rappel appelée testing (définie quelque part dans main.h) et invoquez le hello() à partir de la bibliothèque dynamique

 

typedef void (*callback)(); 
typedef void (*hello_t)(callback); 

/* do something */ 

hello_t hello = (hello_t) dlsym(handle, "hello"); 
hello(testing); 
 

dans la bibliothèque dynamique,

 

#include 
#include "main.h" 

extern "C" void hello(void (*fn)()) { 
    /*do something and then invoke callback function from main */ fn(); 
} 

 

Y at-il d'autres moyens pour permettre aux fonctions/données principal à appeler/utilisés de la bibliothèque dynamique en dehors de l'utilisation callbacks?

Répondre

2

Non, c'est la façon préférée de le faire, à mon avis. Toute autre façon que je peux penser implique de rendre la DLL au courant des objets dans le programme avec lequel elle est liée, ce qui est probablement une mauvaise pratique. En ce qui concerne les données, juste un rappel que vous n'avez pas demandé, il est généralement recommandé de copier toutes les données qui doivent être stockées, si elles sont transmises entre les limites de la bibliothèque/programme. Vous pouvez entrer dans un désordre complet si vous avez la bibliothèque en utilisant des données dont la durée de vie est contrôlée par le programme, et vice versa.

+0

Merci beaucoup – user1492900

+0

C'est parce que je voudrais activer l'utilisation du même logger (log4cxx) dans la bibliothèque principale et dynamique. – user1492900

+0

Dans ce cas, un rappel est définitivement une façon de faire. –

Questions connexes