Безопасно ли передавать указатели функций в качестве аргументов функциям dll и вызывать их изнутри dll?

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

Вопрос

Я хотел бы передать некоторые (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 напрямую?

Именно так я всегда делал это в прошлом. Это не значит, что это правильный путь.
На самом деле, вы можете принять это как признак того, что это наихудший из возможных способов:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top