Я пишу прокси-библиотеку (называемую Библиотекой A), которая является просто интерфейсом для другой DLL (называемой Библиотекой B), которая может присутствовать или отсутствовать в системе . Идея состоит в том, что программа будет связываться с этой библиотекой A вместо исходной библиотеки B; и библиотека A обработала бы ошибки, если бы библиотека B не была установлена в системе.
Итак, типичная функция прокси будет выглядеть так:
int function(int arg1, int arg2)
{
HINSTANCE hinstLib;
UINT errormode = SetErrorMode(SEM_FAILCRITICALERRORS);
SetErrorMode(errormode | SEM_FAILCRITICALERRORS);
hinstLib = LoadLibrary(TEXT(ORIGINAL_DLL));
SetErrorMode (errormode);
if (hinstLib != NULL)
{
ProcAdd = (void *) GetProcAddress(hinstLib, TEXT("function"));
if (NULL != ProcAdd)
{
return (ProcAdd) (arg1, arg2);
}
FreeLibrary(hinstLib);
}
return ERROR;
}
Теперь я бы сделал это для всех исходных записей в библиотеке B. будет много звонков к нему. Так что частая загрузка / выгрузка DLL определенно повлияет на скорость.
Мне было интересно, можно ли использовать глобальную переменную hinstLib; что-то вроде
HINSTANCE hinstLib = LoadLibrary(TEXT(ORIGINAL_DLL));
int function(int arg1, int arg2)
{
if (hinstLib != NULL)
{
ProcAdd = (void *) GetProcAddress(hinstLib, TEXT("function"));
if (NULL != ProcAdd)
{
return (ProcAdd) (arg1, arg2);
}
}
return ERROR;
}
И пусть Windows автоматически выгружает DLL при выходе из программы (при условии, что она выгружает ее).
Заранее спасибо за ваши мудрые замечания ...
Jean-Yves