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

Я хотел бы передать некоторые (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 (& malloc, & free)), а затем выполнить все управление памятью, используя эти общие и, следовательно, всегда совместимые функции.

Ответы [ 2 ]

6 голосов
/ 17 марта 2009

Это не правда. Код DLL обрабатывает указатели на функции точно так же, как и код, отличный от DLL. Если бы это было не так, нельзя было бы использовать стандартные библиотечные функции, такие как qsort () (которая ожидает аргумент указателя на функцию) в DLL.

5 голосов
/ 17 марта 2009

Передача указателей на функции в DLL выполняется в течение нескольких поколений.

Все функции обратного вызова, используемые в программировании GUI (например, обновление индикаторов выполнения), используют указатели функций.

При разработке с использованием WIN32, есть ли причина, по которой вы хотите использовать указатели функций на malloc / free? Почему вы не просто используете malloc / free напрямую?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...