¿Es seguro pasar punteros de función como argumentos para dll funciones e invocarlos desde el interior de dll?

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

Pregunta

Me gustaría pasar algunos (dll o no) punteros de función como argumentos a algunas funciones dll y llamarlos desde el interior de la dll. Me pregunto si es seguro porque he encontrado información en http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref .htm que:

En el código DLL, se supone que un puntero de función apunta a un descriptor de función. Una llamada al puntero de función se realiza obteniendo primero la dirección de la función desreferenciando el puntero; y luego, bifurcando a la entrada de función. Cuando se pasa un puntero de función que no es DLL al código DLL, apunta directamente a la entrada de función. Un intento de desreferenciar a través de dicho puntero produce una dirección de función indefinida. La ramificación posterior a la dirección indefinida puede dar lugar a una excepción.

¿Esta regla se aplica también a Visual Studio y otros compiladores?

Lo que precisamente estoy tratando de hacer es resolver el problema de la asignación de memoria y la desasignación entre varias funciones dll y no dll. Mi idea es pasar dos punteros de función, para funciones comunes de asignación y desasignación, a cada dll en alguna inicialización (por ejemplo, Inicializar (& amp; malloc, & amp; free)) y luego hacer toda la administración de memoria usando estas funciones comunes y, por lo tanto, siempre compatibles.

¿Fue útil?

Solución

No es verdad. El código DLL trata los punteros de función exactamente de la misma manera que el código que no es DLL. Si ese no fuera el caso, uno no podría usar funciones de biblioteca estándar como qsort () (que espera un argumento de puntero de función) dentro de una DLL.

Otros consejos

Pasar punteros de función a una DLL se ha hecho durante generaciones.

Todas las funciones de devolución de llamada utilizadas en la programación de la GUI (por ejemplo, actualización de barras de progreso) utilizan punteros de función.

Al desarrollar usando WIN32, ¿hay alguna razón por la que quiera usar punteros de función para malloc / free? ¿Por qué no estás simplemente usando malloc / free directamente?

Así es como siempre lo he hecho en el pasado. No es que esto garantice que sea la forma correcta.
De hecho, puede tomar eso como una indicación de que es la peor forma posible :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top