AfxLoadLibrary
Используйте AfxLoadLibrary для сопоставления модуль DLL.
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
Параметры
lpszModuleName
Указывает на null-завершенной строке, которая содержит имя модуля (или dll-файла или exe-файла).Указанное имя имя файла модуля.Если строка задает путь, но файл не существует в указанном каталоге, функция завершится ошибкой.
Если путь не указан и расширение имени файла не указано, то по умолчанию является расширением .dll.Однако строки имени файла может включать завершающий знак точки (.) для указания того, что имя модуля не имеет расширение.Если путь не указан, функция выполняет поиск файла в следующей последовательности:
Каталог, из которого приложение удалось загрузить.
Текущий каталог.
Windows 95/98: каталог системы windows.Windows NT: 32 системный каталог windows.Имя этого каталога SYSTEM32.
Windows NT only: 16-разрядный каталог системы windows.Нет функция Win32, которая получает путь к этому каталогу, но производится поиск.Имя этого каталога СИСТЕМЫ.
Каталог Windows.
Каталоги, указанные в переменной среды PATH.
Возвращаемое значение
Если функция завершается успешно, то возвращаемое значение дескриптора к модулю.Если функция завершается неудачей, то возвращаемое значение равно null.
Заметки
Возвращает маркер, который может использоваться в GetProcAddress для получения адреса функции DLL.AfxLoadLibrary также можно использовать для сопоставления другие модули исполняемый файл.
Каждый процесс поддерживает счетчика ссылок для каждого модуля, загружаемой библиотеки.Этот счетчик ссылок увеличивается каждый раз при вызове AfxLoadLibrary декрементируемое и вызывается каждый раз AfxFreeLibrary.Если значение счетчика ссылок достигает нуля, модуль не имеет сопоставления из адресного пространства вызывающего процесса и дескриптор больше не является допустимым.
Обязательно использовать AfxLoadLibrary и AfxFreeLibrary (вместо функции Win32 LoadLibrary и FreeLibrary), если приложение использует несколько потоков и, если она динамически загружает библиотеку DLL расширения.Использование AfxLoadLibrary и гарантирует, что AfxFreeLibrary запуска и завершения работы кода, который выполняется при загрузке и выгружаются библиотеки DLL расширения не может привести к повреждению глобального состояния MFC.
Использование AfxLoadLibrary в приложении необходимо динамически связанный с версии DLL MFC; файл заголовка для AfxLoadLibrary, Afxdll_.h, только если включен MFC в приложение в виде библиотеки DLL связан.Это конструкцией, поскольку необходимо связать с версии DLL MFC для использования или для создания библиотеки DLL расширения.
Пример
// The following shows how to create a MDI based application
// using a generic CView derived class that is implemented in
// a dynamically loaded MFC Extension DLL.
typedef CRuntimeClass * (*GETDLLVIEW)();
BOOL CUserApp::InitInstance()
{
// Standard Application Wizard generated initialization excluded.
...
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views
//Load MFC Extension DLL based view class.
m_hViewDll = AfxLoadLibrary(szMyViewDllPath);
if (!m_hViewDll)
{
CString str;
str.Format(_T("Error: Cannot find component %s"), szMyViewDllPath);
AfxMessageBox(str);
return FALSE;
}
GETDLLVIEW GetMyView = (GETDLLVIEW)GetProcAddress(m_hViewDll, "GetMyView");
ASSERT(GetMyView != NULL);
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_NVC_MFC_DLLUserTYPE,
RUNTIME_CLASS(CUserDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
GetMyView());
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// Standard Application Wizard generated initalization excluded.
...
return TRUE;
}
int CUserApp::ExitInstance()
{
if (NULL != m_hViewDll)
{
AfxFreeLibrary(m_hViewDll);
m_hViewDll = NULL;
}
return CWinApp::ExitInstance();
}
Требования
Header: afxdll_.h