LoadLibrary 및 AfxLoadLibrary
프로세스는 LoadLibrary 또는 AfxLoadLibrary를 호출하여 DLL에 명시적으로 링크합니다. DLL 링크에 성공한 경우 이 함수는 지정된 DLL을 호출 프로세스의 주소 공간에 매핑하고 명시적 링크에 사용되는 다른 함수(GetProcAddress, FreeLibrary 등)와 함께 사용될 수 있는 핸들을 해당 DLL에 반환합니다.
LoadLibrary는 암시적 링크에 사용되는 것과 동일한 검색 시퀀스를 사용하여 DLL을 찾습니다. 시스템에서 DLL을 찾을 수 없거나 진입점 함수가 FALSE를 반환하는 경우에는 LoadLibrary가 NULL을 반환합니다. 또한 LoadLibrary 호출이 이미 매핑된 DLL 모듈을 호출 프로세스의 주소 공간에 지정하는 경우, 이 함수는 단순히 해당 DLL의 핸들을 반환하고 해당 모듈의 참조 횟수를 1만큼 늘립니다.
DLL에 진입점 함수가 있으면 운영 체제에서는 LoadLibrary를 호출한 스레드 컨텍스트에서 이 함수를 호출합니다. 그러나 이전에 LoadLibrary를 호출하고 이에 대응하는 FreeLibrary 함수를 호출하지 않아서 DLL이 이미 프로세스에 연결되어 있으면 진입점 함수는 호출되지 않습니다.
확장 DLL을 로드하는 MFC 응용 프로그램에서는 LoadLibrary 대신 AfxLoadLibrary를 사용해야 합니다. AfxLoadLibrary는 LoadLibrary를 호출하기 전에 스레드 동기화를 처리합니다. AfxLoadLibrary에 대한 인터페이스(함수 프로토타입)는 LoadLibrary의 경우와 같습니다.
몇 가지 이유로 Windows에서 DLL을 로드할 수 없는 경우 프로세스는 오류 복구를 시도합니다. 예를 들어, 프로세스는 사용자에게 오류를 알려 사용자가 다른 DLL 경로를 지정하도록 할 수 있습니다.
실제 사용법
사용예제
//dll에 있는 int Factory(int num) 과 같은 형태의 함수를 typedef로 설정한다.
typedef int (*FactoryFunc)(int num);
//typederf로 설정된 FactoryFunc의 변수를 설정한다.
FactoryFunc lpFactoryFunc; //Dll 인스턴스 핸들 설정
HINSTANCE hDll; //Dll를 로드한다.
hDll =LoadLibrary("ExRegularDll.dll");
if(hDll==NULL)
{
AfxMessageBox("ExReqularDll이 없습니다.");
return;
}
lpFactoryFunc=(FactoryFunc)GetProcAddress(hDll,"Factory"); //함수를 얻는다.
if(lpFactoryFunc==NULL)
{
AfxMessageBox("Factory 함수가 없습니다. ");
return;
}
int num=lpFactoryFunc(2);
FreeLibrary(hDll); //DLL 해제