Исходя из описанного интерфейса, определены следующие
базовые макросы:
Макрос DL_USE_MODULE_LOAD_POLICY_BEGIN(nmspace, name, load_policy)
#define DL_USE_MODULE_LOAD_POLICY_BEGIN(nmspace, name, load_policy)
namespace nmspace
{
DECLARE_NAME_ID(DL_CAT(_MODULE_, nmspace), name)
typedef
delayload::CModule<NAME_ID(DL_CAT(_MODULE_, nmspace)), load_policy>
module_type;
|
определяет в пространстве имен nmspace (тем самым
открывая секцию импорта функций для данной библиотеки) класс модуля, используемого для загрузки библиотеки с именем name, при этом применяя политику
загрузки load_policy. Также в пространстве имен функций импортируемой
библиотеки определяется тип module_type, который представляет собой тип класса
модуля для данной библиотеки и может быть использован для управления временем
жизни библиотеки, например, для ее выгрузки при помощи статического метода
UnloadModule.
Макрос DL_DECLARE_FUN_ERR_POLICY(name_id, r, p, pl)
#define DL_DECLARE_FUN_ERR_POLICY(name_id, r, p, pl)
DECLARE_NAME_ID_A(name_id, DL_STRINGIZE(name_id))
static r (WINAPI *&name_id)(DL_SEQ_ENUM(p)) =
delayload::CDynFunction<module_type, NAME_ID(name_id), delayload::FUN_PROXY(DL_SEQ_SIZE(p))<r, DL_SEQ_ENUM(p), pl >
>::GetProxy();
|
определяет ссылку name_id на указатель на функцию с
именем name_id, типом возвращаемого значения r, списком параметров p и
политикой реакции на ошибку загрузки библиотекипоиска функции pl. Изначально
этот указатель указывает на соответствующую прокси-функцию, однако после
первого вызова функции указатель указывает непосредственно на саму функцию.
Таким образом, использование импортируемой функции из программы тривиально –
это обычный вызов функции из пространства имен (nmspace::name_id).
Неочевидной, но интересной особенностью такой
реализации становится то, что автоматически добавляется поддержка UNICODE
версий импортируемых функций при подключении заголовков от соответствующих
статически линкуемых библиотек, где определены макросы ИмяФункцииW и
ИмяФункцииA.
Использование библиотеки
Так как при создании библиотеки одной из основных
целей было обеспечение простоты ее использования, то наиболее подходящим
интерфейсом объявления импортируемых библиотек и функций оказался интерфейс, внешне напоминающий карты сообщений MFC. В библиотеке определено несколько
макросов, которые значительно упрощают ее использование. Это макросы:
DL_USE_MODULE_BEGIN(nmspace, name) – открывает секцию
импорта функций из библиотеки. Параметр nmspace – название пространства имен, в
которое будет помещены импортируемые функции, name – имя библиотеки, которую
необходимо загрузить. Для загрузки используется LoadLibrary;
DL_USE_MODULE_NON_LOAD_BEGIN(nmspace, name) –
аналогично предыдущему, однако для загрузки используется GetModuleHandle;
DL_DECLARE_FUN(name_id, r, p) – определяет функцию с
именем name_id, типом возвращаемого значения r, и списком типов параметров p в
виде (type1)(type2)…(typen). В случае ошибки при загрузке библиотекипоиске
функции из функции возвращается значение r(). Для функций с возвращаемым
значением void использование данного макроса не имеет смысла, поскольку
распознать ошибку возможным не представится (а в случае Visual C++ 6.0 это
просто не скомпилируется);
DL_DECLARE_FUN_ERR(name_id, r, p, e) – аналогично
предыдущему, однако в случае ошибки при загрузке библиотекипоиске функции возвращается
не r(), а значение, указанное в параметре e;
DL_DECLARE_FUN_THROW(name_id, r, p) – аналогично
предыдущему, однако в случае ошибки при загрузке библиотекипоиске функции
выбрасывается исключение CDynFunException;
Рекомендуем скачать другие рефераты по теме: реферат великая, рецензия на дипломную работу образец.
Предыдущая страница реферата |
5
6
7
8
9
10
11
12
13
14
15 |
Следующая страница реферата