Ключевым является вложенный шаблон Proxy, именно он
наследует прокси-функцию ProxyFun из CFunProxynImpl. Класс CFunProxynImpl
необходим из-за невозможности вернуть тип void при помощи оператора return в
Visual C++ 6.0. В качестве обходного маневра используется специализация
реализации прокси по типу возвращаемого значения – отдельно для типа void и
отдельно для всех остальных типов.
Прокси-функция ProxyFun будет использована в
CDynFunction для первоначальной инициализации адреса указателя на функцию:
static typename proxy_type::fun_type &GetProxy()
{
static typename
proxy_type::fun_type proxy = proxy_type::template
Proxy<type>::ProxyFun;
return proxy;
}
|
Для обеспечения возможности реакции на ошибку
нахождения функции в модуле используется соответствующая стратегия. Стратегия
состоит из класса, вложенного в него шаблона, принимающего в качестве параметра
тип ячейки таблицы импортируемых функций и имеющего статическую функцию
MakeReturn, которая и вызывается при ошибке поиска адреса функции или при
ошибке загрузки библиотеки. На данный момент реализованы 2 стратегии. Одна
(CFunProxyThrowPolicy) – выбрасывает исключение (по умолчанию CDynFunException)
при ошибке поиска функциизагрузки библиотеки, другая (CFunProxyValuePolicy) –
возвращает определенное пользователем значение: