Единая точка входа DLL для многих функций

В обычной библиотеке DLL точки входа и функции, как правило, соотносятся 1:1. У меня есть DLL, которая имеет около 50 функций. Поддерживать их все муторно, и если сигнатуры или типы меняются, то их все нужно обновлять и так далее.

Я думал о том, чтобы создать 1 точку входа для них всех и отправить код, указывающий единственную точку входа, какую функцию вызывать в DLL. Может ли это вызвать какие-либо проблемы, такие как узкие места, особенно в потокобезопасной библиотеке DLL? Я не могу придумать никаких недостатков, так как этот подход будет имитировать запись COM и/или поиск в VTABLE или что-то подобное с одной точкой входа.

Например:

В обычной DLL могут быть экспортированы следующие три функции:

Func1
Func2
Func3

У всех разные точки входа

Предлагаемое решение:

Вызывающий вызывает Func1(iCode) в DLL

Экспортированные Func1 в DLL отображают iCode в Func2 или Func3 или Func4, ... Func50 и т.д.

Таким образом, нужно поддерживать только 1 подпись (с явной привязкой), а не 50. Я не могу предвидеть здесь никаких реальных узких мест. Я пропустил что-то очевидное?


person user2913447    schedule 25.11.2013    source источник
comment
Я не понимаю, как это облегчило бы вам жизнь. Например, как вы будете обрабатывать изменения в соглашениях о вызовах (число параметров и типы)?   -  person 500 - Internal Server Error    schedule 25.11.2013
comment
Все количество и типы параметров могут содержаться в одной подписи с одной точкой входа в dll.   -  person user2913447    schedule 25.11.2013
comment
В этом случае единственными накладными расходами, которые я вижу, будет дополнительный переход/вызов из общей точки входа в фактическую функцию в DLL.   -  person 500 - Internal Server Error    schedule 25.11.2013
comment
Можете ли вы показать пример кода того, чего вы пытаетесь избежать? Ваше описание довольно запутанно   -  person greatwolf    schedule 25.11.2013
comment
Это похоже на то, что Microsoft делает со своим IDispatch COM-интерфейс - каждый вызов функции осуществляется через IDispatch::Invoke. Естественно, IDispatch намного сложнее.   -  person Mark Ransom    schedule 25.11.2013


Ответы (1)


Предлагаемая вами трансформация ничего не изменит. Функции по-прежнему де-факто являются функциями с изменяющимися аргументами и так далее.

Число, которое выбирает функцию в таблице, — это просто еще одна форма обращения к функции.

Первое, что произойдет, это то, что программистам, использующим явную «ioctl-подобную» диспетчеризацию с номерами функций, это очень не понравится, и они напишут подпрограммы-заглушки, которые скроют диспетчеризацию, что сделает их код более читабельным, и дадут им делать такие вещи, как размещение точек останова на отдельных функциях. Эти заглушки-оболочки вполне могут иметь точно такие же сигнатуры, что и исходные функции, и поэтому вы вернулись к исходной точке.

Да, и в Windows функции в DLL уже адресуются по числовому индексу! Файл .def присваивает именам порядковые номера или что-то в этом роде. Посмотрите на эту запись MSDN.

person Kaz    schedule 25.11.2013