Мой вопрос будет использовать примеры из Python, но, похоже, это может быть общий вопрос.
Я использовал динамическое связывание во время загрузки, но по разным причинам (рекомендуется по ссылке ниже) я бы хотел динамически загрузить библиотеку Python:
HINSTANCE hModPython = LoadLibrary(_T("Python27.dll"));
Я могу загрузить Py_Initialize
и другие функции из DLL, но это грязный процесс:
int (*pPy_Initialize)(void);
pPy_Initialize = (int (*)(void))GetProcAddress(hModPython, "Py_Initialize");
pPy_Initialize();
В этот разговор сказано что:
Макросы могут сделать использование этих указателей прозрачным для любого кода C, который вызывает подпрограммы в C API Python.
Мой вопрос заключается в том, как сделать то, что предлагает этот автор, когда я собираюсь импортировать широкий спектр функций с различными сигнатурами. Было бы неплохо использовать подписи, которые уже есть в Python.h (включая этот заголовок).
Я хотел бы сделать так, как это делает системный компоновщик: создать таблицу символов, содержащую все имена функций. Затем просто инициализируйте указатели в этой таблице. Имена функций могут быть либо фиксированными строковыми константами, либо они могут быть прочитаны из самой библиотеки DLL (т.е. Win32 API для перечисления функций экспорта DLL?).
Однако существенным недостатком такого табличного подхода является невозможность использования его с существующим кодом, который вызывает функции по имени (pPy_Initialize();
) — вам нужно использовать указатель в таблице, возможно, проиндексированный через enum (pPy[Initialize]();
).
Различные подписи могут обрабатываться с использованием разных таблиц (таблица на подпись). Сигнатуры также могут храниться вместе с именами в некоторой символической форме, а затем вы можете обернуть их в некую магию доступа, которая может анализировать и проверять ее, но это может быстро стать слишком сложным, например, изобрести еще один язык программирования.
ИМХО, единственное существенное преимущество всего этого странного механизма перед макросами — это то, что вы можете загружать с него произвольные библиотеки DLL. Кроме этого, я бы не пошел по этому пути.
Других решений пока нет …