В обычной 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. Я не могу предвидеть никаких узких мест. Я что-то упускаю из виду?
Предложенная вами трансформация ничего не изменит. Функции все еще являются де-факто функциями с изменяющимися аргументами и так далее.
Число, которое выбирает функцию в таблице, является еще одной формой обращения к функции.
Первое, что произойдет, это то, что программистам, использующим явную «ioctl-подобную» диспетчеризацию с номерами функций, это не очень понравится, и они напишут процедуры-заглушки, которые скрывают диспетчеризацию, что сделает их код более читабельным, и позволит им делать вещи, как ставить точки останова на отдельных функциях. Эти заглушки-обертки могут иметь те же сигнатуры, что и исходные функции, поэтому вы вернулись к исходной точке.
Да, а в Windows функции в DLL уже обозначены числовым индексом! .def
В файле присваиваются порядковые номера именам или что-то в этом роде. Посмотрите на эту запись MSDN.
Других решений пока нет …