È sicuro passare i puntatori a funzione come argomenti per le funzioni DLL e invocarli dall'interno della DLL?

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

Domanda

Vorrei passare alcuni puntatori di funzione (dll o no) come argomenti ad alcune funzioni di dll e chiamarli dall'interno della dll. Mi chiedo se sia sicuro perché ho trovato informazioni su http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref .htm che:

Nel codice DLL, si presume che un puntatore a funzione faccia riferimento a un descrittore di funzione. Viene effettuata una chiamata al puntatore di funzione ottenendo prima l'indirizzo della funzione mediante la dereferenziazione del puntatore; e quindi, ramificando la voce della funzione. Quando un puntatore a una funzione non DLL viene passato al codice DLL, punta direttamente alla voce della funzione. Un tentativo di dereference attraverso un tale puntatore produce un indirizzo di funzione indefinito. La successiva diramazione all'indirizzo non definito può comportare un'eccezione.

Questa regola si applica anche a Visual Studio e altri compilatori?

Ciò che sto esattamente cercando di fare è risolvere il problema di allocazione della memoria e deallocazione tra varie funzioni DLL e non DLL. La mia idea è quella di passare due puntatori di funzione - per le funzioni di allocazione e deallocazione comuni - a ogni dll in qualche inizializzazione (ad esempio Initialize (& amp; malloc, & amp; free)) e quindi fare tutta la gestione della memoria usando queste funzioni comuni e quindi sempre compatibili.

È stato utile?

Soluzione

Non è vero. Il codice DLL tratta i puntatori a funzione esattamente allo stesso modo del codice non DLL. In caso contrario, non è possibile utilizzare le funzioni di libreria standard come qsort () (che prevede un argomento del puntatore a funzione) all'interno di una DLL.

Altri suggerimenti

Il passaggio dei puntatori di funzione a una DLL è stato eseguito per generazioni.

Tutte le funzioni di callback utilizzate nella programmazione della GUI (ad esempio l'aggiornamento delle barre di avanzamento) utilizzano i puntatori a funzione.

Quando si sviluppa utilizzando WIN32, c'è un motivo per cui si desidera utilizzare i puntatori di funzione per malloc / free? Perché non stai semplicemente usando direttamente malloc / free?

È così che l'ho sempre fatto in passato. Non che questo garantisca che sia il modo corretto.
In effetti, potresti prenderlo come un'indicazione che è il peggior modo possibile :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top