2009-03-17 3 views
4

Je voudrais passer des pointeurs de fonction (dll ou non) comme arguments à certaines fonctions dll et les appeler de l'intérieur de la DLL. Je me demande si c'est sûr parce que j'ai trouvé une information sur http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref.htm que:Est-il prudent de passer des pointeurs de fonction en tant qu'arguments aux fonctions dll et de les appeler de l'intérieur de la DLL?

Dans le code de DLL, on suppose qu'un pointeur de fonction pointe vers un descripteur de fonction. Un appel de pointeur de fonction est effectué en obtenant d'abord l'adresse de fonction par déréférencement du pointeur; puis, en se ramifiant à l'entrée de la fonction. Lorsqu'un pointeur de fonction non-DLL est passé au code DLL, il pointe directement vers l'entrée de la fonction. Une tentative de déréférencement à travers un tel pointeur produit une adresse de fonction indéfinie. La dérivation ultérieure à l'adresse indéfinie peut entraîner une exception. Cette règle s'applique-t-elle également à Visual Studio et à d'autres compilateurs?

Ce que j'essaie précisément de faire est de résoudre le problème de l'allocation de mémoire et de la désallocation entre diverses fonctions dll et non-dll. Mon idée est de passer deux pointeurs de fonction - pour les fonctions communes d'allocation et de désallocation - à chaque DLL dans une initialisation (par exemple Initialize (& malloc, & free)) puis de gérer la mémoire en utilisant ces fonctions communes et donc toujours compatibles.

+0

L'article référencé n'est pas pour Windows. Les fonctions exportées n'étaient spéciales que dans Win16. – Joshua

Répondre

6

Ce n'est pas vrai. Le code DLL traite les pointeurs de fonction exactement de la même manière que le code non-DLL. Si ce n'était pas le cas, on ne pourrait pas utiliser les fonctions de bibliothèque standard comme qsort() (qui attend un argument de pointeur de fonction) dans une DLL.

5

Le passage de pointeurs de fonction vers une DLL a été effectué depuis des générations.

Toutes les fonctions de rappel utilisées dans la programmation GUI (par exemple, la mise à jour des barres de progression) utilisent des pointeurs de fonction.

Lors du développement en utilisant WIN32, existe-t-il une raison pour laquelle vous voulez utiliser des pointeurs de fonction pour malloc/free? Pourquoi n'utilisez-vous pas simplement malloc/free directement?

C'est comme cela que je l'ai toujours fait dans le passé. Pas que cela garantisse que c'est la bonne façon.
En fait, vous pourriez prendre cela comme une indication que c'est la pire des manières :)

+2

"Pourquoi n'utilisez-vous pas simplement malloc/free directement?" - car l'utilisation de 'free' dans une DLL de la mémoire 'malloced' dans une DLL différente provoque le plus souvent un plantage. –

+0

Je n'arrive pas à voir comment fournir un niveau d'indirection permettrait de corriger cela, sauf si vous avez votre propre gestion de la mémoire. Je n'ai pas couru à travers les problèmes de crash quand malloc/libèrent de différentes DLL tant que vous ne faites pas un double libre. – Benoit

+1

http://msdn.microsoft.com/en-us/library/ms235460.aspx Le niveau supplémentaire d'indirection permet d'accéder à des fonctions uniques partagées (entre toutes les DLL) pour la gestion de la mémoire. –

Questions connexes