Безопасно ли передавать указатели функций в качестве аргументов функциям dll и вызывать их изнутри dll?
-
19-08-2019 - |
Вопрос
Я хотел бы передать некоторые (dll или нет) указатели на функции в качестве аргументов некоторым функциям dll и вызывать их изнутри dll. Интересно, безопасно ли это, потому что я нашел информацию на http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref .htm что:
В коде DLL предполагается, что указатель функции указывает на дескриптор функции. Вызов указателя на функцию выполняется сначала путем получения адреса функции путем разыменования указателя; а затем переход к функции записи. Когда указатель на функцию, не относящуюся к DLL, передается в код DLL, он указывает непосредственно на запись функции. Попытка разыменования через такой указатель приводит к неопределенному адресу функции. Последующее переход по неопределенному адресу может привести к исключению.
Применимо ли это правило к Visual Studio и другим компиляторам?
Что именно я пытаюсь сделать, так это решить проблему выделения и освобождения памяти между различными dll и не dll функциями. Моя идея состоит в том, чтобы передать два указателя на функции - для общих функций выделения и освобождения - каждому dll при некоторой инициализации (например, Initialize (& Amp; malloc, & Amp; free)), а затем выполнить все управление памятью, используя эти общие и, следовательно, всегда совместимые функции.
Решение
Это не правда. Код DLL обрабатывает указатели на функции точно так же, как и код, отличный от DLL. Если бы это было не так, нельзя было бы использовать стандартные библиотечные функции, такие как qsort () (которая ожидает аргумент указателя на функцию) в DLL.
Другие советы
Передача указателей на функции в DLL выполнялась в течение нескольких поколений.
Все функции обратного вызова, используемые в программировании GUI (например, обновление индикаторов выполнения), используют указатели функций. Р>
При разработке с использованием WIN32, есть ли причина, по которой вы хотите использовать указатели функций для malloc / free? Почему вы не просто используете malloc / free напрямую? Р>
Именно так я всегда делал это в прошлом. Это не значит, что это правильный путь.
На самом деле, вы можете принять это как признак того, что это наихудший из возможных способов:)