AfxLoadLibrary
Use AfxLoadLibrary para mapear um módulo DLL.
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
Parâmetros
lpszModuleName
Aponta para uma cadeia terminada com nulo que contém o nome do módulo (qualquer um.DLL ou.Arquivo EXE).O nome especificado é o nome do arquivo do módulo.Se a seqüência de caracteres Especifica um caminho, mas o arquivo não existe no diretório especificado, a função falhará.
Se um caminho não for especificado e a extensão de nome de arquivo for omitida, a extensão padrão.DLL é acrescentado.No entanto, a seqüência de caracteres de nome de arquivo pode incluir um caractere à direita do ponto (.) para indicar que o nome do módulo tem sem extensão.Quando nenhum caminho for especificado, a função procura o arquivo na seqüência a seguir:
O diretório do qual o aplicativo é carregado.
O diretório atual.
Windows 95/98: diretório de sistema do Windows.Windows NT: o diretório de sistema do Windows de 32 bits.O nome deste diretório é SYSTEM32.
Somente de Windows NT: diretório de sistema do Windows A 16 bits.Não há nenhuma função Win32 que obtém o caminho desta pasta, mas é pesquisado.O nome deste diretório é o sistema.
O diretório do Windows.
Diretórios listados na variável de ambiente PATH.
Valor de retorno
Se a função tiver êxito, o valor de retorno é um identificador para o módulo.Se a função falhar, o valor de retorno é NULL.
Comentários
Ele retorna um identificador que pode ser usado em GetProcAddress para obter o endereço de uma função DLL.AfxLoadLibrarytambém pode ser usado para mapear outros módulos executáveis.
Cada processo mantém uma contagem de referência para cada módulo carregado biblioteca.A contagem de referência é incrementada cada vez AfxLoadLibrary é chamado e é decrementado sempre AfxFreeLibrary é chamado.Quando a contagem de referência atinge zero, o módulo é não mapeado no espaço de endereço do processo de chamada e o identificador não é válido.
Certifique-se de usar AfxLoadLibrary e AfxFreeLibrary (em vez de funções Win32 LoadLibrary e FreeLibrary) se seu aplicativo usa vários threads e se ele dinamicamente carrega uma extensão DLL.Usando AfxLoadLibrary e AfxFreeLibrary assegura que o código de inicialização e desligamento que executa quando a extensão DLL é carregada e descarregada não corromper o estado global do MFC.
Usando AfxLoadLibrary em um aplicativo requer que você vincular dinamicamente para a versão da DLL do MFC; o arquivo de cabeçalho para AfxLoadLibrary, Afxdll_.h, só é incluído se o MFC está vinculada ao aplicativo como uma DLL.Isso ocorre porque é necessário vincular a versão de DLL do MFC para usar ou criar DLLs de extensão.
Exemplo
// 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();
}
Requisitos
Cabeçalho: afxdll_.h