Est-il prudent de passer des pointeurs de fonction en tant qu'arguments aux fonctions dll et de les invoquer à l'intérieur de la dll?

StackOverflow https://stackoverflow.com/questions/653697

Question

Je voudrais passer des pointeurs de fonctions (dll ou non) comme arguments à des fonctions dll et les appeler de l'intérieur de la dll. Je me demande si c'est sans danger car j'ai trouvé une information sur http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref .htm qui:

Dans le code DLL, il est supposé 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 la fonction par déréférencement du pointeur; et ensuite, passer à l'entrée de fonction. Lorsqu'un pointeur de fonction non DLL est transmis au code DLL, il pointe directement sur l'entrée de la fonction. Une tentative de déréférence via un tel pointeur produit une adresse de fonction non définie. Le branchement ultérieur à l'adresse non dé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, c’est de résoudre le problème de l’allocation de mémoire et de la désallocation de mémoire entre diverses fonctions dll et non-dll. Mon idée est de transmettre deux pointeurs de fonction - pour les fonctions d’allocation et de désallocation communes - à chaque dll lors d’une initialisation (par exemple, Initialize (& malloc, & free)), puis d’effectuer toute la gestion de la mémoire à l’aide de ces fonctions communes et donc toujours compatibles.

Était-ce utile?

La solution

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 des fonctions de bibliothèque standard telles que qsort () (qui attend un argument de pointeur de fonction) dans une DLL.

Autres conseils

Le passage de pointeurs de fonction à une DLL est effectué depuis des générations.

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

Lorsque vous développez avec WIN32, y a-t-il une raison pour laquelle vous souhaitez utiliser les pointeurs de fonction sur malloc / free? Pourquoi n'utilisez-vous pas simplement malloc / free directement?

C'est comme ça 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 du fait que c'est la pire façon possible:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top