AfxLoadLibrary
Użycie AfxLoadLibrary Aby zamapować modułu DLL.
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
Parametry
lpszModuleName
Wskazuje na ciąg zakończony znakiem null, który zawiera nazwę modułu (albo.DLL lub.Plik EXE).Podana nazwa jest nazwą pliku modułu.Jeśli ciąg Określa ścieżkę, ale plik nie istnieje w określonym katalogu, funkcja kończy się niepowodzeniem.
Jeśli ścieżka nie zostanie określona, a rozszerzenie nazwy pliku zostanie pominięty, domyślnie rozszerzenie.DLL jest dołączana.Jednakże ciąg Nazwa pliku może zawierać końcowego znaku punkt (.), aby wskazać, że nazwa modułu nie ma rozszerzenia.Jeśli żadna ścieżka nie jest określona, funkcja szuka tego pliku w następującej kolejności:
Katalog, z którego ładowany jest aplikacja.
Bieżący katalog.
System Windows 95/98: katalogu systemu Windows.Windows NT: katalogu systemowego Windows 32-bitowych.Nazwa tego katalogu jest katalog SYSTEM32.
Tylko system Windows NT: katalogu systemowym 16-bitowej wersji systemu Windows.Nie ma żadnych funkcji Win32, która uzyskuje ścieżkę to katalogu, ale będzie przeszukiwana.Nazwa tego katalogu jest SYSTEM.
Katalog systemu Windows.
Katalogi wymienione w zmiennej środowiskowej PATH.
Wartość zwracana
Jeśli funkcja się powiedzie, wartość zwracana jest dojścia do modułu.Jeśli funkcja zawiedzie, wartość zwracana jest wartość NULL.
Uwagi
Zwraca dojście, które mogą być używane w GetProcAddress celu uzyskania adresu funkcji DLL.AfxLoadLibrarymożna również mapować innych modułów pliku wykonywalnego.
Każdy proces przechowuje licznika odwołań dla każdego modułu załadować biblioteki.Ta liczba odwołań jest zwiększana za każdym razem AfxLoadLibrary nazywa się i jest zmniejszany, każdorazowo AfxFreeLibrary nazywa się.Gdy liczba odwołań osiągnie zero, moduł jest niezamapowany z przestrzeni adresowej procesu wywołującego i dojście nie jest już prawidłowy.
Należy użyć AfxLoadLibrary i AfxFreeLibrary (a nie funkcji Win32 LoadLibrary i FreeLibrary) Jeśli aplikacja używa wielu wątków i dynamicznie ładuje biblioteki DLL rozszerzenia.Za pomocą AfxLoadLibrary i AfxFreeLibrary gwarantuje, że kod uruchamiania i zamykania, który wykonuje, gdy biblioteka DLL rozszerzenia jest załadowane lub wyładowane nie doprowadzić do uszkodzenia globalnego MFC.
Za pomocą AfxLoadLibrary w aplikacji wymagane jest dynamiczne łącze do wersji biblioteki DLL, biblioteki MFC; Plik nagłówka dla AfxLoadLibrary, Afxdll_.h, jest tylko jeżeli MFC jest związane z zastosowaniem jako biblioteki DLL.Jest to zgodne z projektem ponieważ trzeba utworzyć łącze do wersji biblioteki DLL MFC lub utworzeniu biblioteki DLL rozszerzenia.
Przykład
// 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();
}
Wymagania
Nagłówek: afxdll_.h