Obtention d'un pointeur vide via dlsym(), le but est de invoque la fonction référencée par ce pointeur. La tentative de conversion par conversion à l'aide de static_cast ou reinterpret_cast a échoué, contrairement à une conversion de style C.
La conversion directe d'un pointeur vide en pointeur de fonction n'est pas autorisée dans C 98/03. Cependant, C 0x offre un support conditionnel, permettant à une implémentation de dicter le comportement.
Approche comportementale non définie :
Bien qu'il ne soit pas défini par la norme, le code suivant peut fonctionner sur la plupart des plateformes :
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Alternative :
<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Approche complexe mais portable :
Cette méthode exploite le fait que l'adresse d'un pointeur de fonction est un pointeur d'objet :
<code class="cpp">// Get address as object pointer void (**object_ptr)() = &my_ptr; // Convert to void** (also an object pointer) void **ppv = reinterpret_cast<void**>(object_ptr); // Store address from 'gptr' in memory cell pointed to by 'ppv' *ppv = gptr;</code>
Cette approche reste indéfinie dans la norme mais devrait fonctionner raisonnablement bien sur la plupart des implémentations.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!