// закрываем окно с компонентом StringGrid, если оно было создано
if( hGrid != NULL )
::SendMessage(hGrid, WM_CLOSE, 0, 0);
// выгрузка dll из памяти
FreeLibrary( hDll );
}
// обработчик события окна WM_CREATE
int CUsingExplicitDLLDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if
(CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// загрузка dll в память
hDll =
LoadLibrary("ExplicitDll.dll");
return 0;
}
Явная загрузка dll имеет как преимущества, так и
недостатки. В нашем случае большим плюсом является то, что явная загрузка
избавляет от какого бы то ни было взаимодействия с исходным кодом dll, в
частности нет необходимости подключать заголовочный .h-файл с объявлениями
функций. Клиентское приложение компилируется и работает независимо от
используемой dll, а случаи неудачной загрузки библиотеки или неудачного
получения адреса функции всегда можно обыграть так, чтобы они не повлияли на
дальнейшее выполнение основного приложения.
ПРИМЕЧАНИЕ
Следует отметить, что использование
экспортируемых unmanaged-функций из управляемого кода (managed code) в .NET
осуществляется исключительно посредством явной загрузки dll. К процессу
вызова функции в этом случае помимо стандартных шагов (таких как загрузка dll
в память посредством LoadLibrary, получение адреса требуемой функции с помощью
GetProcAddress и непосредственно вызов), добавляется также процесс маршалинга
(marshaling), то есть процесс преобразования типов данных .NET в их аналоги в
традиционном двоичном коде (при проталкивании аргументов в стек) и обратно
(при анализе возвращаемого значения). Для указания, что метод импортируется
из dll, используется атрибут DllImport, параметры которого содержат
информацию, необходимую для вызова LoadLibrary и GetProcAddress.
Таким образом, для вызова экспортируемой функции из
dll, скомпилированной в BCB, необходимо выполнить следующую последовательность
действийя:
Объявить экспортируемые функции либо как __cdecl, либо
как __stdcall. Если используется только соглашение __stdcall, пропускаем пункт
3.
Поместить объявления функций в блок extern ”С”. Не
экспортировать классы и функции-члены классов, поскольку это все равно не
удастся.
Рекомендуем скачать другие рефераты по теме: инновационная деятельность, заключение дипломной работы.