В связи с этим первый вариант определения шаблона
CModule мог бы выглядеть так:
template <LPCTSTR Name>
class CModule;
|
Тут следует сделать небольшое отступление. Как было бы
прекрасно, если бы любой абстрактный язык программирования, используемый нами, обеспечивал бы любую востребованную нами возможность. Но, очевидно, по
соображениям здравого смысла, это невыполнимо, поэтому приходится пользоваться
тем, что есть. А есть такая неприятная вещь – в С++ напрямую инстанцировать
шаблон строковым литералом не получится. Шаблон может быть инстанцирован только
константой с external linkage, а строковый литерал имеет internal linkage. На
первый взгляд, все достаточно печально. Однако, как обычно, решение лежит на
поверхности. Оно очень простое и очевидное. Мы будем инстанцировать шаблон
модуля уникальным классом, инкапсулирующим строковый литерал. Сам же класс
будет формироваться при помощи макросов:
#define DECLARE_NAME_ID_IMPL(id, name, ret, text)
struct NAME_ID(id)
{
enum {length = sizeof(name)};
static ret GetStr(){return
text(name);}
};
#define DECLARE_NAME_ID_A(id, name) DECLARE_NAME_ID_IMPL(id, name, LPCSTR, DL_EMPTY())
#define DECLARE_NAME_ID(id, name) DECLARE_NAME_ID_IMPL(id, name, LPCTSTR,_T)
|
Данный класс является универсальным и будет
использован в дальнейшем и для представления имен импортируемых функций. Но и
тут есть один маленький нюанс – поскольку функция GetProcAddress использует
только ANSI строки, то мы вынуждены это предусмотреть, объявив дополнительный
макрос DECLARE_NAME_ID_A.
Итак, в связи со всем вышеизложенным, определение
шаблона CModule без учета стратегий будет выглядеть так:
template <class Name>
class CModule;
|
Теперь добавим стратегии загрузкивыгрузки модуля.
Поскольку стратегия контролирует процессы, связанные с загрузкой и выгрузкой, у
нее должно быть как минимум 2 функции. Одна отвечает за загрузку модуля, вторая
за его выгрузку:
Рекомендуем скачать другие рефераты по теме: реферат великая, рецензия на дипломную работу образец.
Предыдущая страница реферата |
1
2
3
4
5
6
7
8
9
10
11 |
Следующая страница реферата